|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 10/12] libs/{light,guest}: implement xc_cpuid_apply_policy in libxl
On 17/01/2022 09:48, Roger Pau Monne wrote:
> diff --git a/tools/libs/light/libxl_cpuid.c b/tools/libs/light/libxl_cpuid.c
> index e1acf6648d..7dcdb35a4c 100644
> --- a/tools/libs/light/libxl_cpuid.c
> +++ b/tools/libs/light/libxl_cpuid.c
> @@ -454,6 +456,41 @@ int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid,
> bool restore,
> */
> bool nested_virt = info->nested_hvm.val > 0;
>
> + policy = xc_cpu_policy_init();
> + if (!policy) {
> + LOGED(ERROR, domid, "Failed to init CPU policy");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> + r = xc_cpu_policy_get_domain(ctx->xch, domid, policy);
> + if (r) {
> + LOGED(ERROR, domid, "Failed to fetch domain CPU policy");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> + if (restore) {
> + /*
> + * Make sure the policy is compatible with pre Xen 4.13. Note that
> + * newer Xen versions will pass policy data on the restore stream, so
> + * any adjustments done here will be superseded.
> + */
> + r = xc_cpu_policy_make_compat_4_12(ctx->xch, policy, hvm);
One hidden host policy acquisition, and ...
> + if (r) {
> + LOGED(ERROR, domid, "Failed to setup compatible CPU policy");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> + }
> +
> + r = xc_cpu_policy_legacy_topology(ctx->xch, policy, hvm);
... one host featureset and ... (final comment)
> + if (r) {
> + LOGED(ERROR, domid, "Failed to setup CPU policy topology");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> /*
> * For PV guests, PAE is Xen-controlled (it is the 'p' that
> differentiates
> * the xen-3.0-x86_32 and xen-3.0-x86_32p ABIs). It is mandatory as Xen
> @@ -466,6 +503,13 @@ int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid,
> bool restore,
> */
> if (info->type == LIBXL_DOMAIN_TYPE_HVM)
> pae = libxl_defbool_val(info->u.hvm.pae);
> + rc = libxl_cpuid_parse_config(&info->cpuid, GCSPRINTF("pae=%d", pae));
> + if (rc) {
> + LOGD(ERROR, domid, "Failed to set PAE CPUID flag");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
>
> /*
> * Advertising Invariant TSC to a guest means that the TSC frequency
> won't
> @@ -481,14 +525,50 @@ int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid,
> bool restore,
> */
> itsc = (libxl_defbool_val(info->disable_migrate) ||
> info->tsc_mode == LIBXL_TSC_MODE_ALWAYS_EMULATE);
> + rc = libxl_cpuid_parse_config(&info->cpuid, GCSPRINTF("invtsc=%d",
> itsc));
> + if (rc) {
> + LOGD(ERROR, domid, "Failed to set Invariant TSC CPUID flag");
> + rc = ERROR_FAIL;
> + goto out;
> + }
>
> - r = xc_cpuid_apply_policy(ctx->xch, domid, restore, NULL, 0,
> - pae, itsc, nested_virt, info->cpuid);
> - if (r)
> - LOGEVD(ERROR, -r, domid, "Failed to apply CPUID policy");
> + /* Set Nested virt CPUID bits for HVM. */
> + if (hvm) {
> + rc = libxl_cpuid_parse_config(&info->cpuid, GCSPRINTF("vmx=%d",
> + nested_virt));
> + if (rc) {
> + LOGD(ERROR, domid, "Failed to set VMX CPUID flag");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> + rc = libxl_cpuid_parse_config(&info->cpuid, GCSPRINTF("svm=%d",
> + nested_virt));
> + if (rc) {
> + LOGD(ERROR, domid, "Failed to set SVM CPUID flag");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> + }
libxl_cpuid_parse_config() is a large overhead, and cannot suffer errors
because libxl crashes rather than failing memory allocations. The
invasiveness would be reduced substantially by having:
str = GCSPRINTF("pae=%d,invtsc=%d", pae, itsc);
if ( hvm )
append GCSPRINTF("vmx=%d,svm=%d", nested_virt, nested_virt);
and a single call to libxl_cpuid_parse_config().
Depending on how much we care, these need inserting at the head of the
info->cpuid list so they get processed in the same order as before.
> +
> + /* Apply the bits from info->cpuid if any. */
'if any' is stale now.
> + r = xc_cpu_policy_apply_cpuid(ctx->xch, policy, info->cpuid, hvm);
... and both a host and default policy.
That is a lot of overhead added behind the scenes. It would be rather
better to have this function obtain the host policy and pass it to all 3
helpers. Default policy is harder to judge, but it would avoid needing
to pass an `hvm` boolean down into this helper.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |