Blame SOURCES/kvm-i386-cpu-hyperv-support-over-64-vcpus-for-windows-gu.patch

9bac43
From b2f9f4fcaad9c64f4551ab1dbe9e474c3dc6b2b4 Mon Sep 17 00:00:00 2001
9bac43
From: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
Date: Mon, 27 Nov 2017 12:59:13 +0100
9bac43
Subject: [PATCH 10/15] i386/cpu/hyperv: support over 64 vcpus for windows
9bac43
 guests
9bac43
9bac43
RH-Author: vrozenfe <vrozenfe@redhat.com>
9bac43
Message-id: <1511256034-28105-1-git-send-email-vrozenfe@redhat.com>
9bac43
Patchwork-id: 77769
9bac43
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH v2] i386/cpu/hyperv: support over 64 vcpus for windows guests
9bac43
Bugzilla: 1451959
9bac43
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
9bac43
RH-Acked-by: Thomas Huth <thuth@redhat.com>
9bac43
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
9bac43
From: Gonglei <arei.gonglei@huawei.com>
9bac43
9bac43
Upstream-status: 6c69dfb67e84747cf071958594d939e845dfcc0c
9bac43
9bac43
Starting with Windows Server 2012 and Windows 8, if
9bac43
CPUID.40000005.EAX contains a value of -1, Windows assumes specific
9bac43
limit to the number of VPs. In this case, Windows Server 2012
9bac43
guest VMs may use more than 64 VPs, up to the maximum supported
9bac43
number of processors applicable to the specific Windows
9bac43
version being used.
9bac43
9bac43
https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
9bac43
9bac43
For compatibility, Let's introduce a new property for X86CPU,
9bac43
named "x-hv-max-vps" as Eduardo's suggestion, and set it
9bac43
to 0x40 before machine 2.10.
9bac43
9bac43
(The "x-" prefix indicates that the property is not supposed to
9bac43
be a stable user interface.)
9bac43
9bac43
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
9bac43
Message-Id: <1505143227-14324-1-git-send-email-arei.gonglei@huawei.com>
9bac43
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
9bac43
Signed-off-by: Vadim Rozenfeld <vrozenfe@redhat.com>
9bac43
---
9bac43
 include/hw/i386/pc.h |  5 +++++
9bac43
 target/i386/cpu.c    | 13 +++++++++++++
9bac43
 target/i386/cpu.h    |  2 ++
9bac43
 target/i386/kvm.c    |  3 ++-
9bac43
 4 files changed, 22 insertions(+), 1 deletion(-)
9bac43
9bac43
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
9bac43
index 7b46121..f9b7998 100644
9bac43
--- a/include/hw/i386/pc.h
9bac43
+++ b/include/hw/i386/pc.h
9bac43
@@ -1089,6 +1089,11 @@ extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
9bac43
             .driver = TYPE_X86_CPU,\
9bac43
             .property = "kvm-no-smi-migration",\
9bac43
             .value    = "on",\
9bac43
+        },\
9bac43
+        { /* PC_RHEL7_4_COMPAT from PC_COMPAT_2_10 */ \
9bac43
+             .driver   = TYPE_X86_CPU,\
9bac43
+             .property = "x-hv-max-vps",\
9bac43
+             .value    = "0x40",\
9bac43
         },
9bac43
 
9bac43
 #define PC_RHEL7_2_COMPAT \
9bac43
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
9bac43
index ca95336..c2dee60 100644
9bac43
--- a/target/i386/cpu.c
9bac43
+++ b/target/i386/cpu.c
9bac43
@@ -4179,6 +4179,19 @@ static Property x86_cpu_properties[] = {
9bac43
                      false),
9bac43
     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
9bac43
     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
9bac43
+    /*
9bac43
+     * From "Requirements for Implementing the Microsoft
9bac43
+     * Hypervisor Interface":
9bac43
+     * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
9bac43
+     *
9bac43
+     * "Starting with Windows Server 2012 and Windows 8, if
9bac43
+     * CPUID.40000005.EAX contains a value of -1, Windows assumes that
9bac43
+     * the hypervisor imposes no specific limit to the number of VPs.
9bac43
+     * In this case, Windows Server 2012 guest VMs may use more than
9bac43
+     * 64 VPs, up to the maximum supported number of processors applicable
9bac43
+     * to the specific Windows version being used."
9bac43
+     */
9bac43
+    DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
9bac43
     DEFINE_PROP_END_OF_LIST()
9bac43
 };
9bac43
 
9bac43
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
9bac43
index 0518673..fd73888 100644
9bac43
--- a/target/i386/cpu.h
9bac43
+++ b/target/i386/cpu.h
9bac43
@@ -1282,6 +1282,8 @@ struct X86CPU {
9bac43
     int32_t socket_id;
9bac43
     int32_t core_id;
9bac43
     int32_t thread_id;
9bac43
+
9bac43
+    int32_t hv_max_vps;
9bac43
 };
9bac43
 
9bac43
 static inline X86CPU *x86_env_get_cpu(CPUX86State *env)
9bac43
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
9bac43
index 739334a..ee4e91f 100644
9bac43
--- a/target/i386/kvm.c
9bac43
+++ b/target/i386/kvm.c
9bac43
@@ -786,7 +786,8 @@ int kvm_arch_init_vcpu(CPUState *cs)
9bac43
 
9bac43
         c = &cpuid_data.entries[cpuid_i++];
9bac43
         c->function = HYPERV_CPUID_IMPLEMENT_LIMITS;
9bac43
-        c->eax = 0x40;
9bac43
+
9bac43
+        c->eax = cpu->hv_max_vps;
9bac43
         c->ebx = 0x40;
9bac43
 
9bac43
         kvm_base = KVM_CPUID_SIGNATURE_NEXT;
9bac43
-- 
9bac43
1.8.3.1
9bac43