|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v2 2/2] viridian: allow vCPU hotplug for Windows VMs
> -----Original Message-----
> From: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
> Sent: 12 January 2021 04:17
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: iwj@xxxxxxxxxxxxxx; wl@xxxxxxx; andrew.cooper3@xxxxxxxxxx;
> george.dunlap@xxxxxxxxxx;
> jbeulich@xxxxxxxx; julien@xxxxxxx; sstabellini@xxxxxxxxxx;
> anthony.perard@xxxxxxxxxx; paul@xxxxxxx;
> roger.pau@xxxxxxxxxx; Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
> Subject: [PATCH v2 2/2] viridian: allow vCPU hotplug for Windows VMs
>
> If Viridian extensions are enabled, Windows wouldn't currently allow
> a hotplugged vCPU to be brought up dynamically. We need to expose a special
> bit to let the guest know we allow it. Hide it behind an option to stay
> on the safe side regarding compatibility with existing guests but
> nevertheless set the option on by default.
>
> Signed-off-by: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
LGTM
Reviewed-by: Paul Durrant <paul@xxxxxxx>
> ---
> Changes on v2:
> - hide the bit under an option and expose it in libxl
> ---
> docs/man/xl.cfg.5.pod.in | 7 ++++++-
> tools/include/libxl.h | 6 ++++++
> tools/libs/light/libxl_types.idl | 1 +
> tools/libs/light/libxl_x86.c | 4 ++++
> xen/arch/x86/hvm/viridian/viridian.c | 5 ++++-
> xen/include/public/hvm/params.h | 7 ++++++-
> 6 files changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
> index 3467eae..7cdb859 100644
> --- a/docs/man/xl.cfg.5.pod.in
> +++ b/docs/man/xl.cfg.5.pod.in
> @@ -2267,11 +2267,16 @@ explicitly have any limits on the number of Virtual
> processors a guest
> is allowed to bring up. It is strongly recommended to keep this enabled
> for guests with more than 64 vCPUs.
>
> +=item B<cpu_hotplug>
> +
> +This set enables dynamic changes to Virtual processor states in Windows
> +guests effectively allowing vCPU hotplug.
> +
> =item B<defaults>
>
> This is a special value that enables the default set of groups, which
> is currently the B<base>, B<freq>, B<time_ref_count>, B<apic_assist>,
> -B<crash_ctl>, B<stimer> and B<no_vp_limit> groups.
> +B<crash_ctl>, B<stimer>, B<no_vp_limit> and B<cpu_hotplug> groups.
>
> =item B<all>
>
> diff --git a/tools/include/libxl.h b/tools/include/libxl.h
> index be1e288..7c7c541 100644
> --- a/tools/include/libxl.h
> +++ b/tools/include/libxl.h
> @@ -458,6 +458,12 @@
> #define LIBXL_HAVE_VIRIDIAN_NO_VP_LIMIT 1
>
> /*
> + * LIBXL_HAVE_VIRIDIAN_CPU_HOTPLUG indicates that the 'cpu_hotplug' value
> + * is present in the viridian enlightenment enumeration.
> + */
> +#define LIBXL_HAVE_VIRIDIAN_CPU_HOTPLUG 1
> +
> +/*
> * LIBXL_HAVE_DEVICE_PCI_LIST_FREE indicates that the
> * libxl_device_pci_list_free() function is defined.
> */
> diff --git a/tools/libs/light/libxl_types.idl
> b/tools/libs/light/libxl_types.idl
> index 8502b29..00a8e68 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -240,6 +240,7 @@ libxl_viridian_enlightenment =
> Enumeration("viridian_enlightenment", [
> (9, "hcall_ipi"),
> (10, "ex_processor_masks"),
> (11, "no_vp_limit"),
> + (12, "cpu_hotplug"),
> ])
>
> libxl_hdtype = Enumeration("hdtype", [
> diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
> index 5c4c194..91a9fc7 100644
> --- a/tools/libs/light/libxl_x86.c
> +++ b/tools/libs/light/libxl_x86.c
> @@ -310,6 +310,7 @@ static int hvm_set_viridian_features(libxl__gc *gc,
> uint32_t domid,
> libxl_bitmap_set(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST);
> libxl_bitmap_set(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL);
> libxl_bitmap_set(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_NO_VP_LIMIT);
> + libxl_bitmap_set(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_CPU_HOTPLUG);
> }
>
> libxl_for_each_set_bit(v, info->u.hvm.viridian_enable) {
> @@ -373,6 +374,9 @@ static int hvm_set_viridian_features(libxl__gc *gc,
> uint32_t domid,
> if (libxl_bitmap_test(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_NO_VP_LIMIT))
> mask |= HVMPV_no_vp_limit;
>
> + if (libxl_bitmap_test(&enlightenments,
> LIBXL_VIRIDIAN_ENLIGHTENMENT_CPU_HOTPLUG))
> + mask |= HVMPV_cpu_hotplug;
> +
> if (mask != 0 &&
> xc_hvm_param_set(CTX->xch,
> domid,
> diff --git a/xen/arch/x86/hvm/viridian/viridian.c
> b/xen/arch/x86/hvm/viridian/viridian.c
> index ae1ea86..b906f7b 100644
> --- a/xen/arch/x86/hvm/viridian/viridian.c
> +++ b/xen/arch/x86/hvm/viridian/viridian.c
> @@ -76,6 +76,7 @@ typedef union _HV_CRASH_CTL_REG_CONTENTS
> } HV_CRASH_CTL_REG_CONTENTS;
>
> /* Viridian CPUID leaf 3, Hypervisor Feature Indication */
> +#define CPUID3D_CPU_DYNAMIC_PARTITIONING (1 << 3)
> #define CPUID3D_CRASH_MSRS (1 << 10)
> #define CPUID3D_SINT_POLLING (1 << 17)
>
> @@ -179,8 +180,10 @@ void cpuid_viridian_leaves(const struct vcpu *v,
> uint32_t leaf,
> res->a = u.lo;
> res->b = u.hi;
>
> + if ( viridian_feature_mask(d) & HVMPV_cpu_hotplug )
> + res->d = CPUID3D_CPU_DYNAMIC_PARTITIONING;
> if ( viridian_feature_mask(d) & HVMPV_crash_ctl )
> - res->d = CPUID3D_CRASH_MSRS;
> + res->d |= CPUID3D_CRASH_MSRS;
> if ( viridian_feature_mask(d) & HVMPV_synic )
> res->d |= CPUID3D_SINT_POLLING;
>
> diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
> index 805f4ca..c9d6e70 100644
> --- a/xen/include/public/hvm/params.h
> +++ b/xen/include/public/hvm/params.h
> @@ -172,6 +172,10 @@
> #define _HVMPV_no_vp_limit 11
> #define HVMPV_no_vp_limit (1 << _HVMPV_no_vp_limit)
>
> +/* Enable vCPU hotplug */
> +#define _HVMPV_cpu_hotplug 12
> +#define HVMPV_cpu_hotplug (1 << _HVMPV_cpu_hotplug)
> +
> #define HVMPV_feature_mask \
> (HVMPV_base_freq | \
> HVMPV_no_freq | \
> @@ -184,7 +188,8 @@
> HVMPV_stimer | \
> HVMPV_hcall_ipi | \
> HVMPV_ex_processor_masks | \
> - HVMPV_no_vp_limit)
> + HVMPV_no_vp_limit | \
> + HVMPV_cpu_hotplug)
>
> #endif
>
> --
> 2.7.4
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |