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@citrix.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
Igor Druzhinin authored and Jan Beulich committed 2021-01-29 14:18:43 +01:00
1 parent 9835246710
commit 7e5cffcd1e
6 files changed
+27 -3

No files matched your search

+6 -1
View File
@@ -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>
+6
View File
@@ -457,6 +457,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.
+1
View File
@@ -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", [
+4
View File
@@ -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,
+4 -1
View File
@@ -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;
+6 -1
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.