|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 10/12] xen/tools: add sve parameter in XL configuration
On Mon, Mar 27, 2023 at 11:59:42AM +0100, Luca Fancellu wrote:
> diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
> index 10f37990be57..adf48fe8ac1d 100644
> --- a/docs/man/xl.cfg.5.pod.in
> +++ b/docs/man/xl.cfg.5.pod.in
> @@ -2952,6 +2952,17 @@ Currently, only the "sbsa_uart" model is supported for
> ARM.
>
> =back
>
> +=item B<sve="NUMBER">
> +
> +To enable SVE, user must specify a number different from zero, maximum 2048
> and
> +multiple of 128. That value will be the maximum number of SVE registers bits
> +that the hypervisor will impose to this guest. If the platform has a lower
Maybe start by describing what the "sve" value is before imposing
limits. Maybe something like:
Set the maximum vector length that a guest's Scalable Vector
Extension (SVE) can use. Or disable it by specifying 0, the default.
Value needs to be a multiple of 128, with a maximum of 2048 or the
maximum supported by the platform.
Would this, or something like that be a good explanation of the "sve"
configuration option?
> +supported bits value, then the domain creation will fail.
> +A value equal to zero is the default and it means this guest is not allowed
> to
> +use SVE.
> +
> +=back
> +
> =head3 x86
>
> =over 4
> diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c
> index ddc7b2a15975..16a49031fd51 100644
> --- a/tools/libs/light/libxl_arm.c
> +++ b/tools/libs/light/libxl_arm.c
> @@ -211,6 +211,8 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
> return ERROR_FAIL;
> }
>
> + config->arch.sve_vl = d_config->b_info.arch_arm.sve;
This truncate a 16bit value into an 8bit value, I think you should check
that the value can actually fit.
And maybe check `d_config->b_info.arch_arm.sve` value here instead of
`xl` as commented later.
> +
> return 0;
> }
>
> diff --git a/tools/libs/light/libxl_types.idl
> b/tools/libs/light/libxl_types.idl
> index fd31dacf7d5a..ef4a8358e54e 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -690,6 +690,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>
> ("arch_arm", Struct(None, [("gic_version", libxl_gic_version),
> ("vuart", libxl_vuart_type),
> + ("sve", uint16),
I wonder if renaming "sve" to "sve_vl" here would make sense, seeing
that "sve_vl" is actually used in other places.
> ])),
> ("arch_x86", Struct(None, [("msr_relaxed", libxl_defbool),
> ])),
> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index 1f6f47daf4e1..3cbc23b36952 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -12,6 +12,7 @@
> * GNU Lesser General Public License for more details.
> */
>
> +#include <arm-arch-capabilities.h>
Could you add this headers after public ones?
> #include <ctype.h>
> #include <inttypes.h>
> #include <limits.h>
> @@ -1312,8 +1313,6 @@ void parse_config_data(const char *config_source,
> exit(EXIT_FAILURE);
> }
>
> - libxl_physinfo_dispose(&physinfo);
> -
> config= xlu_cfg_init(stderr, config_source);
> if (!config) {
> fprintf(stderr, "Failed to allocate for configuration\n");
> @@ -2887,6 +2886,29 @@ skip_usbdev:
> }
> }
>
> + if (!xlu_cfg_get_long (config, "sve", &l, 0)) {
> + unsigned int arm_sve_vl =
> + arch_capabilities_arm_sve(physinfo.arch_capabilities);
> + if (!arm_sve_vl) {
> + fprintf(stderr, "SVE is not supported by the platform\n");
> + exit(-ERROR_FAIL);
"ERROR_FAIL" is a "libxl_error", instead exit with "EXIT_FAILURE".
> + } else if (((l % 128) != 0) || (l > 2048)) {
> + fprintf(stderr,
> + "Invalid sve value: %ld. Needs to be <= 2048 and
> multiple"
> + " of 128\n", l);
> + exit(-ERROR_FAIL);
> + } else if (l > arm_sve_vl) {
> + fprintf(stderr,
> + "Invalid sve value: %ld. Platform supports up to %u
> bits\n",
> + l, arm_sve_vl);
> + exit(-ERROR_FAIL);
> + }
> + /* Vector length is divided by 128 in domain configuration struct */
That's wrong, beside this comment there's nothing that say that
`b_info->arch_arm.sve` needs to have a value divided by 128.
`b_info->arch_arm.sve` is just of type uint16_t (libxl_type.idl).
BTW, "tools/xl" (xl) use just one user of "tools/libs/light" (libxl), so
it's possible that other users would set `sve` to a value that haven't
been checked. So I think all the check that the `sve` value is correct
could be done in libxl instead.
> + b_info->arch_arm.sve = l / 128U;
> + }
> +
> + libxl_physinfo_dispose(&physinfo);
> +
> parse_vkb_list(config, d_config);
>
> d_config->virtios = NULL;
Thanks,
--
Anthony PERARD
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |