9c6c51
From efc0312e1edb3d8196806606fbb639bbbd0bd6d4 Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <efc0312e1edb3d8196806606fbb639bbbd0bd6d4@dist-git>
9c6c51
From: Vitaly Kuznetsov <vkuznets@redhat.com>
9c6c51
Date: Thu, 9 Aug 2018 15:14:21 +0200
9c6c51
Subject: [PATCH] conf: qemu: add support for Hyper-V PV TLB flush
9c6c51
MIME-Version: 1.0
9c6c51
Content-Type: text/plain; charset=UTF-8
9c6c51
Content-Transfer-Encoding: 8bit
9c6c51
9c6c51
Qemu-3.0 supports Hyper-V-style PV TLB flush, Windows guests can benefit
9c6c51
from this feature as KVM knows which vCPUs are not currently scheduled (and
9c6c51
thus don't require any immediate action).
9c6c51
9c6c51
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
9c6c51
Reviewed-by: John Ferlan <jferlan@redhat.com>
9c6c51
(cherry picked from commit f4c39db7366376bd95e1751b0e3ced9c73c14f5b)
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1589702
9c6c51
9c6c51
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9c6c51
Reviewed-by: Ján Tomko <jtomko@redhat.com>
9c6c51
---
9c6c51
 docs/formatdomain.html.in               | 7 +++++++
9c6c51
 docs/schemas/domaincommon.rng           | 5 +++++
9c6c51
 src/conf/domain_conf.c                  | 6 +++++-
9c6c51
 src/conf/domain_conf.h                  | 1 +
9c6c51
 src/cpu/cpu_x86.c                       | 3 +++
9c6c51
 src/cpu/cpu_x86_data.h                  | 1 +
9c6c51
 src/qemu/qemu_command.c                 | 1 +
9c6c51
 src/qemu/qemu_parse_command.c           | 1 +
9c6c51
 src/qemu/qemu_process.c                 | 1 +
9c6c51
 tests/qemuxml2argvdata/hyperv-off.xml   | 1 +
9c6c51
 tests/qemuxml2argvdata/hyperv.args      | 2 +-
9c6c51
 tests/qemuxml2argvdata/hyperv.xml       | 1 +
9c6c51
 tests/qemuxml2xmloutdata/hyperv-off.xml | 1 +
9c6c51
 tests/qemuxml2xmloutdata/hyperv.xml     | 1 +
9c6c51
 14 files changed, 30 insertions(+), 2 deletions(-)
9c6c51
9c6c51
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
9c6c51
index 43a1067501..c019b26644 100644
9c6c51
--- a/docs/formatdomain.html.in
9c6c51
+++ b/docs/formatdomain.html.in
9c6c51
@@ -1917,6 +1917,7 @@
9c6c51
     <vendor_id state='on' value='KVM Hv'/>
9c6c51
     <frequencies state='on'/>
9c6c51
     <reenlightenment state='on'/>
9c6c51
+    <tlbflush state='on'/>
9c6c51
   </hyperv>
9c6c51
   <kvm>
9c6c51
     <hidden state='on'/>
9c6c51
@@ -2051,6 +2052,12 @@
9c6c51
            on, off
9c6c51
           4.7.0 (QEMU 3.0)
9c6c51
         
9c6c51
+        
9c6c51
+          tlbflush
9c6c51
+          Enable PV TLB flush support
9c6c51
+           on, off
9c6c51
+          4.7.0 (QEMU 3.0)
9c6c51
+        
9c6c51
       
9c6c51
       
9c6c51
       
pvspinlock
9c6c51
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
9c6c51
index ceee7a8efe..1c6f2a295d 100644
9c6c51
--- a/docs/schemas/domaincommon.rng
9c6c51
+++ b/docs/schemas/domaincommon.rng
9c6c51
@@ -5723,6 +5723,11 @@
9c6c51
             <ref name="featurestate"/>
9c6c51
           </element>
9c6c51
         </optional>
9c6c51
+        <optional>
9c6c51
+          <element name="tlbflush">
9c6c51
+            <ref name="featurestate"/>
9c6c51
+          </element>
9c6c51
+        </optional>
9c6c51
       </interleave>
9c6c51
     </element>
9c6c51
   </define>
9c6c51
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
9c6c51
index 18b4d03a61..e013e9f0c5 100644
9c6c51
--- a/src/conf/domain_conf.c
9c6c51
+++ b/src/conf/domain_conf.c
9c6c51
@@ -171,7 +171,8 @@ VIR_ENUM_IMPL(virDomainHyperv, VIR_DOMAIN_HYPERV_LAST,
9c6c51
               "reset",
9c6c51
               "vendor_id",
9c6c51
               "frequencies",
9c6c51
-              "reenlightenment")
9c6c51
+              "reenlightenment",
9c6c51
+              "tlbflush")
9c6c51
 
9c6c51
 VIR_ENUM_IMPL(virDomainKVM, VIR_DOMAIN_KVM_LAST,
9c6c51
               "hidden")
9c6c51
@@ -20055,6 +20056,7 @@ virDomainDefParseXML(xmlDocPtr xml,
9c6c51
             case VIR_DOMAIN_HYPERV_RESET:
9c6c51
             case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
             case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+            case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
                 break;
9c6c51
 
9c6c51
             case VIR_DOMAIN_HYPERV_SPINLOCKS:
9c6c51
@@ -22248,6 +22250,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
9c6c51
             case VIR_DOMAIN_HYPERV_RESET:
9c6c51
             case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
             case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+            case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
                 if (src->hyperv_features[i] != dst->hyperv_features[i]) {
9c6c51
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
9c6c51
                                    _("State of HyperV enlightenment "
9c6c51
@@ -27898,6 +27901,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
9c6c51
                     case VIR_DOMAIN_HYPERV_RESET:
9c6c51
                     case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
                     case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+                    case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
                         break;
9c6c51
 
9c6c51
                     case VIR_DOMAIN_HYPERV_SPINLOCKS:
9c6c51
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
9c6c51
index e450923019..d32514e7e6 100644
9c6c51
--- a/src/conf/domain_conf.h
9c6c51
+++ b/src/conf/domain_conf.h
9c6c51
@@ -1793,6 +1793,7 @@ typedef enum {
9c6c51
     VIR_DOMAIN_HYPERV_VENDOR_ID,
9c6c51
     VIR_DOMAIN_HYPERV_FREQUENCIES,
9c6c51
     VIR_DOMAIN_HYPERV_REENLIGHTENMENT,
9c6c51
+    VIR_DOMAIN_HYPERV_TLBFLUSH,
9c6c51
 
9c6c51
     VIR_DOMAIN_HYPERV_LAST
9c6c51
 } virDomainHyperv;
9c6c51
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
9c6c51
index 7a48b78eb9..7fa84f6014 100644
9c6c51
--- a/src/cpu/cpu_x86.c
9c6c51
+++ b/src/cpu/cpu_x86.c
9c6c51
@@ -113,6 +113,8 @@ KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_FREQUENCIES,
9c6c51
                 0x40000003, 0x00000800);
9c6c51
 KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_REENLIGHTENMENT,
9c6c51
                 0x40000003, 0x00002000);
9c6c51
+KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_TLBFLUSH,
9c6c51
+                0x40000004, 0x00000004);
9c6c51
 
9c6c51
 static virCPUx86Feature x86_kvm_features[] =
9c6c51
 {
9c6c51
@@ -135,6 +137,7 @@ static virCPUx86Feature x86_kvm_features[] =
9c6c51
     KVM_FEATURE(VIR_CPU_x86_KVM_HV_RESET),
9c6c51
     KVM_FEATURE(VIR_CPU_x86_KVM_HV_FREQUENCIES),
9c6c51
     KVM_FEATURE(VIR_CPU_x86_KVM_HV_REENLIGHTENMENT),
9c6c51
+    KVM_FEATURE(VIR_CPU_x86_KVM_HV_TLBFLUSH),
9c6c51
 };
9c6c51
 
9c6c51
 typedef struct _virCPUx86Model virCPUx86Model;
9c6c51
diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h
9c6c51
index a810c64fc9..090a21156f 100644
9c6c51
--- a/src/cpu/cpu_x86_data.h
9c6c51
+++ b/src/cpu/cpu_x86_data.h
9c6c51
@@ -65,6 +65,7 @@ struct _virCPUx86CPUID {
9c6c51
 # define VIR_CPU_x86_KVM_HV_RESET     "__kvm_hv_reset"
9c6c51
 # define VIR_CPU_x86_KVM_HV_FREQUENCIES "__kvm_hv_frequencies"
9c6c51
 # define VIR_CPU_x86_KVM_HV_REENLIGHTENMENT "__kvm_hv_reenlightenment"
9c6c51
+# define VIR_CPU_x86_KVM_HV_TLBFLUSH  "__kvm_hv_tlbflush"
9c6c51
 
9c6c51
 
9c6c51
 # define VIR_CPU_X86_DATA_INIT { 0 }
9c6c51
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
9c6c51
index 48f3b09ec9..a3d605c00f 100644
9c6c51
--- a/src/qemu/qemu_command.c
9c6c51
+++ b/src/qemu/qemu_command.c
9c6c51
@@ -6921,6 +6921,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
9c6c51
             case VIR_DOMAIN_HYPERV_RESET:
9c6c51
             case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
             case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+            case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
                 if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON)
9c6c51
                     virBufferAsprintf(&buf, ",hv_%s",
9c6c51
                                       virDomainHypervTypeToString(i));
9c6c51
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
9c6c51
index 1e67a5a8c8..fdc1d34068 100644
9c6c51
--- a/src/qemu/qemu_parse_command.c
9c6c51
+++ b/src/qemu/qemu_parse_command.c
9c6c51
@@ -1538,6 +1538,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
9c6c51
             case VIR_DOMAIN_HYPERV_RESET:
9c6c51
             case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
             case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+            case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
                 if (value) {
9c6c51
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
9c6c51
                                    _("HyperV feature '%s' should not "
9c6c51
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
9c6c51
index 990d4d3046..23958bcbce 100644
9c6c51
--- a/src/qemu/qemu_process.c
9c6c51
+++ b/src/qemu/qemu_process.c
9c6c51
@@ -3925,6 +3925,7 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
9c6c51
         case VIR_DOMAIN_HYPERV_RESET:
9c6c51
         case VIR_DOMAIN_HYPERV_FREQUENCIES:
9c6c51
         case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
9c6c51
+        case VIR_DOMAIN_HYPERV_TLBFLUSH:
9c6c51
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
9c6c51
                            _("host doesn't support hyperv '%s' feature"),
9c6c51
                            virDomainHypervTypeToString(i));
9c6c51
diff --git a/tests/qemuxml2argvdata/hyperv-off.xml b/tests/qemuxml2argvdata/hyperv-off.xml
9c6c51
index b2e3612df9..dc5777355f 100644
9c6c51
--- a/tests/qemuxml2argvdata/hyperv-off.xml
9c6c51
+++ b/tests/qemuxml2argvdata/hyperv-off.xml
9c6c51
@@ -22,6 +22,7 @@
9c6c51
       <vendor_id state='off'/>
9c6c51
       <frequencies state='off'/>
9c6c51
       <reenlightenment state='off'/>
9c6c51
+      <tlbflush state='off'/>
9c6c51
     </hyperv>
9c6c51
   </features>
9c6c51
   <clock offset='utc'/>
9c6c51
diff --git a/tests/qemuxml2argvdata/hyperv.args b/tests/qemuxml2argvdata/hyperv.args
9c6c51
index 4feafad8e2..6ee6198fb0 100644
9c6c51
--- a/tests/qemuxml2argvdata/hyperv.args
9c6c51
+++ b/tests/qemuxml2argvdata/hyperv.args
9c6c51
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
9c6c51
 -machine pc,accel=tcg,usb=off,dump-guest-core=off \
9c6c51
 -cpu 'qemu32,hv_relaxed,hv_vapic,hv_spinlocks=0x2fff,hv_vpindex,hv_runtime,\
9c6c51
 hv_synic,hv_stimer,hv_reset,hv_vendor_id=KVM Hv,hv_frequencies,\
9c6c51
-hv_reenlightenment' \
9c6c51
+hv_reenlightenment,hv_tlbflush' \
9c6c51
 -m 214 \
9c6c51
 -smp 6,sockets=6,cores=1,threads=1 \
9c6c51
 -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
9c6c51
diff --git a/tests/qemuxml2argvdata/hyperv.xml b/tests/qemuxml2argvdata/hyperv.xml
9c6c51
index 20fcdba59e..816adf6907 100644
9c6c51
--- a/tests/qemuxml2argvdata/hyperv.xml
9c6c51
+++ b/tests/qemuxml2argvdata/hyperv.xml
9c6c51
@@ -22,6 +22,7 @@
9c6c51
       <vendor_id state='on' value='KVM Hv'/>
9c6c51
       <frequencies state='on'/>
9c6c51
       <reenlightenment state='on'/>
9c6c51
+      <tlbflush state='on'/>
9c6c51
     </hyperv>
9c6c51
   </features>
9c6c51
   <clock offset='utc'/>
9c6c51
diff --git a/tests/qemuxml2xmloutdata/hyperv-off.xml b/tests/qemuxml2xmloutdata/hyperv-off.xml
9c6c51
index 4a41e0c37e..77a8dac810 100644
9c6c51
--- a/tests/qemuxml2xmloutdata/hyperv-off.xml
9c6c51
+++ b/tests/qemuxml2xmloutdata/hyperv-off.xml
9c6c51
@@ -22,6 +22,7 @@
9c6c51
       <vendor_id state='off'/>
9c6c51
       <frequencies state='off'/>
9c6c51
       <reenlightenment state='off'/>
9c6c51
+      <tlbflush state='off'/>
9c6c51
     </hyperv>
9c6c51
   </features>
9c6c51
   <clock offset='utc'/>
9c6c51
diff --git a/tests/qemuxml2xmloutdata/hyperv.xml b/tests/qemuxml2xmloutdata/hyperv.xml
9c6c51
index 183b45980b..fc8c59a557 100644
9c6c51
--- a/tests/qemuxml2xmloutdata/hyperv.xml
9c6c51
+++ b/tests/qemuxml2xmloutdata/hyperv.xml
9c6c51
@@ -22,6 +22,7 @@
9c6c51
       <vendor_id state='on' value='KVM Hv'/>
9c6c51
       <frequencies state='on'/>
9c6c51
       <reenlightenment state='on'/>
9c6c51
+      <tlbflush state='on'/>
9c6c51
     </hyperv>
9c6c51
   </features>
9c6c51
   <clock offset='utc'/>
9c6c51
-- 
9c6c51
2.19.1
9c6c51