All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] viridian: remove implicit limit of 64 VPs per partition
@ 2021-01-08  0:46 Igor Druzhinin
  2021-01-08  0:46 ` [PATCH 2/2] viridian: allow vCPU hotplug for Windows VMs Igor Druzhinin
                   ` (2 more replies)
  0 siblings, 3 replies; 27+ messages in thread
From: Igor Druzhinin @ 2021-01-08  0:46 UTC (permalink / raw)
  To: xen-devel
  Cc: paul, wl, iwj, anthony.perard, andrew.cooper3, george.dunlap,
	jbeulich, julien, sstabellini, roger.pau, Igor Druzhinin

TLFS 7.8.1 stipulates that "a virtual processor index must be less than
the maximum number of virtual processors per partition" that "can be obtained
through CPUID leaf 0x40000005". Furthermore, "Requirements for Implementing
the Microsoft Hypervisor Interface" defines that starting from Windows Server
2012, which allowed more than 64 CPUs to be brought up, this leaf can now
contain a value -1 basically assuming the hypervisor has no restriction while
0 (that we currently expose) means the default restriction is still present.

Along with previous changes exposing ExProcessorMasks this allows a recent
Windows VM with Viridian extension enabled to have more than 64 vCPUs without
going into immediate BSOD.

Since we didn't expose the leaf before and to keep CPUID data consistent for
incoming streams from previous Xen versions - let's keep it behind an option.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
---
 tools/libs/light/libxl_x86.c         |  2 +-
 xen/arch/x86/hvm/viridian/viridian.c | 23 +++++++++++++++++++++++
 xen/include/public/hvm/params.h      |  7 ++++++-
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
index 86d2729..96c8bf1 100644
--- a/tools/libs/light/libxl_x86.c
+++ b/tools/libs/light/libxl_x86.c
@@ -336,7 +336,7 @@ static int hvm_set_viridian_features(libxl__gc *gc, uint32_t domid,
         LOG(DETAIL, "%s group enabled", libxl_viridian_enlightenment_to_string(v));
 
     if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE)) {
-        mask |= HVMPV_base_freq;
+        mask |= HVMPV_base_freq | HVMPV_no_vp_limit;
 
         if (!libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ))
             mask |= HVMPV_no_freq;
diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c
index ed97804..ae1ea86 100644
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -209,6 +209,29 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf,
         res->b = viridian_spinlock_retry_count;
         break;
 
+    case 5:
+        /*
+         * From "Requirements for Implementing the Microsoft Hypervisor
+         *  Interface":
+         *
+         * "On Windows operating systems versions through Windows Server
+         * 2008 R2, reporting the HV#1 hypervisor interface limits
+         * the Windows virtual machine to a maximum of 64 VPs, regardless of
+         * what is reported via CPUID.40000005.EAX.
+         *
+         * Starting with Windows Server 2012 and Windows 8, if
+         * CPUID.40000005.EAX containsa value of -1, Windows assumes that
+         * the hypervisor imposes no specific limit to the number of VPs.
+         * In this case, Windows Server 2012 guest VMs may use more than 64
+         * VPs, up to the maximum supported number of processors applicable
+         * to the specific Windows version being used."
+         *
+         * For compatibility we hide it behind an option.
+         */
+        if ( viridian_feature_mask(d) & HVMPV_no_vp_limit )
+            res->a = -1;
+        break;
+
     case 6:
         /* Detected and in use hardware features. */
         if ( cpu_has_vmx_virtualize_apic_accesses )
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index 3b0a0f4..805f4ca 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -168,6 +168,10 @@
 #define _HVMPV_ex_processor_masks 10
 #define HVMPV_ex_processor_masks (1 << _HVMPV_ex_processor_masks)
 
+/* Allow more than 64 VPs */
+#define _HVMPV_no_vp_limit 11
+#define HVMPV_no_vp_limit (1 << _HVMPV_no_vp_limit)
+
 #define HVMPV_feature_mask \
         (HVMPV_base_freq | \
          HVMPV_no_freq | \
@@ -179,7 +183,8 @@
          HVMPV_synic | \
          HVMPV_stimer | \
          HVMPV_hcall_ipi | \
-         HVMPV_ex_processor_masks)
+         HVMPV_ex_processor_masks | \
+         HVMPV_no_vp_limit)
 
 #endif
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2021-01-11 13:50 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-08  0:46 [PATCH 1/2] viridian: remove implicit limit of 64 VPs per partition Igor Druzhinin
2021-01-08  0:46 ` [PATCH 2/2] viridian: allow vCPU hotplug for Windows VMs Igor Druzhinin
2021-01-08  8:38   ` Paul Durrant
2021-01-08 11:29     ` Igor Druzhinin
2021-01-08 11:33       ` Paul Durrant
2021-01-08 11:35         ` Igor Druzhinin
2021-01-08 11:40           ` Paul Durrant
2021-01-08 11:42             ` Igor Druzhinin
2021-01-08  8:32 ` [PATCH 1/2] viridian: remove implicit limit of 64 VPs per partition Paul Durrant
2021-01-08 10:15   ` Andrew Cooper
2021-01-08 11:48   ` Igor Druzhinin
2021-01-09  0:55   ` Igor Druzhinin
2021-01-11  8:45     ` Paul Durrant
2021-01-11  8:59       ` Jan Beulich
2021-01-11  9:09         ` Paul Durrant
2021-01-11  9:12           ` Paul Durrant
2021-01-11  9:16             ` Jan Beulich
2021-01-11  9:20               ` Paul Durrant
2021-01-11 13:34               ` Igor Druzhinin
2021-01-11 13:38                 ` Jan Beulich
2021-01-11 13:47                   ` Paul Durrant
2021-01-11 13:50                     ` Igor Druzhinin
2021-01-11  9:13           ` Jan Beulich
2021-01-08  9:19 ` Jan Beulich
2021-01-08 11:27   ` Igor Druzhinin
2021-01-08 13:17     ` Jan Beulich
2021-01-08 13:25       ` Igor Druzhinin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.