]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: support for kvm-hint-dedicated performance hint
authorWim ten Have <wim.ten.have@oracle.com>
Mon, 12 Aug 2019 12:30:29 +0000 (14:30 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 12 Aug 2019 13:13:04 +0000 (15:13 +0200)
QEMU version 2.12.1 introduced a performance feature under commit
be7773268d98 ("target-i386: add KVM_HINTS_DEDICATED performance hint")

This patch adds a new KVM feature 'hint-dedicated' to set this performance
hint for KVM guests. The feature is off by default.

To enable this hint and have libvirt add "-cpu host,kvm-hint-dedicated=on"
to the QEMU command line, the following XML code needs to be added to the
guest's domain description in conjunction with CPU mode='host-passthrough'.

  <features>
    <kvm>
      <hint-dedicated state='on'/>
    </kvm>
  </features>
  ...
  <cpu mode='host-passthrough ... />

Signed-off-by: Wim ten Have <wim.ten.have@oracle.com>
Signed-off-by: Menno Lageman <menno.lageman@oracle.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_command.c
src/qemu/qemu_domain.c

index 6d084d7c047223807e86ea288555a00a57005766..a18119f9a08e1b15d0547d56d5094f80cd31cce5 100644 (file)
   &lt;/hyperv&gt;
   &lt;kvm&gt;
     &lt;hidden state='on'/&gt;
+    &lt;hint-dedicated state='on'/&gt;
   &lt;/kvm&gt;
   &lt;pvspinlock state='on'/&gt;
   &lt;gic version='2'/&gt;
           <td>on, off</td>
           <td><span class="since">1.2.8 (QEMU 2.1.0)</span></td>
         </tr>
+        <tr>
+          <td>hint-dedicated</td>
+          <td>Allows a guest to enable optimizations when running on dedicated vCPUs</td>
+          <td>on, off</td>
+          <td><span class="since">5.7.0 (QEMU 2.12.1)</span></td>
+        </tr>
       </table>
       </dd>
       <dt><code>pmu</code></dt>
index a0771da45b5df268a600f8d6be385905a6f8ccc6..08853f9d9e9216a0082cbccd170dded49839b357 100644 (file)
             <ref name="featurestate"/>
           </element>
         </optional>
+        <optional>
+          <element name="hint-dedicated">
+            <ref name="featurestate"/>
+          </element>
+        </optional>
       </interleave>
     </element>
   </define>
index 03312afaaff8603e2e014d10f35d0bad23a1d1c4..3907fcf6e5ca250b406a286895e9eaec7e440775 100644 (file)
@@ -202,6 +202,7 @@ VIR_ENUM_IMPL(virDomainHyperv,
 VIR_ENUM_IMPL(virDomainKVM,
               VIR_DOMAIN_KVM_LAST,
               "hidden",
+              "hint-dedicated",
 );
 
 VIR_ENUM_IMPL(virDomainMsrsUnknown,
@@ -20412,6 +20413,7 @@ virDomainDefParseXML(xmlDocPtr xml,
 
             switch ((virDomainKVM) feature) {
                 case VIR_DOMAIN_KVM_HIDDEN:
+                case VIR_DOMAIN_KVM_DEDICATED:
                     if (!(tmp = virXMLPropString(nodes[i], "state"))) {
                         virReportError(VIR_ERR_XML_ERROR,
                                        _("missing 'state' attribute for "
@@ -22624,6 +22626,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
         for (i = 0; i < VIR_DOMAIN_KVM_LAST; i++) {
             switch ((virDomainKVM) i) {
             case VIR_DOMAIN_KVM_HIDDEN:
+            case VIR_DOMAIN_KVM_DEDICATED:
                 if (src->kvm_features[i] != dst->kvm_features[i]) {
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                                    _("State of KVM feature '%s' differs: "
@@ -28124,6 +28127,7 @@ virDomainDefFormatFeatures(virBufferPtr buf,
             for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) {
                 switch ((virDomainKVM) j) {
                 case VIR_DOMAIN_KVM_HIDDEN:
+                case VIR_DOMAIN_KVM_DEDICATED:
                     if (def->kvm_features[j])
                         virBufferAsprintf(&childBuf, "<%s state='%s'/>\n",
                                           virDomainKVMTypeToString(j),
index bce47443c858e7df73f19cf31a9c06f7b3237818..f7423b1b6f89d69b1e909e21af0655616d86fb4c 100644 (file)
@@ -1765,6 +1765,7 @@ typedef enum {
 
 typedef enum {
     VIR_DOMAIN_KVM_HIDDEN = 0,
+    VIR_DOMAIN_KVM_DEDICATED,
 
     VIR_DOMAIN_KVM_LAST
 } virDomainKVM;
index 71a36ff63a819fe2270a5aecbb9da995443ddab2..f096e8f27e583379dad1e66a5277376c937e4f54 100644 (file)
@@ -7212,6 +7212,11 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
                     virBufferAddLit(&buf, ",kvm=off");
                 break;
 
+            case VIR_DOMAIN_KVM_DEDICATED:
+                if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_ON)
+                    virBufferAddLit(&buf, ",kvm-hint-dedicated=on");
+                break;
+
             /* coverity[dead_error_begin] */
             case VIR_DOMAIN_KVM_LAST:
                 break;
index 937b461a8b554e92eaba9cf93f51f5a62d6dbc11..b9c5a4e541081fcab9bbea33c30f81e72044dba0 100644 (file)
@@ -4449,6 +4449,16 @@ qemuDomainDefValidateFeatures(const virDomainDef *def,
             }
             break;
 
+        case VIR_DOMAIN_FEATURE_KVM:
+            if (def->kvm_features[VIR_DOMAIN_KVM_DEDICATED] == VIR_TRISTATE_SWITCH_ON &&
+                (!def->cpu || def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("kvm-hint-dedicated=on is only applicable "
+                                 "for cpu host-passthrough"));
+                return -1;
+            }
+            break;
+
         case VIR_DOMAIN_FEATURE_ACPI:
         case VIR_DOMAIN_FEATURE_APIC:
         case VIR_DOMAIN_FEATURE_PAE:
@@ -4456,7 +4466,6 @@ qemuDomainDefValidateFeatures(const virDomainDef *def,
         case VIR_DOMAIN_FEATURE_VIRIDIAN:
         case VIR_DOMAIN_FEATURE_PRIVNET:
         case VIR_DOMAIN_FEATURE_HYPERV:
-        case VIR_DOMAIN_FEATURE_KVM:
         case VIR_DOMAIN_FEATURE_PVSPINLOCK:
         case VIR_DOMAIN_FEATURE_CAPABILITIES:
         case VIR_DOMAIN_FEATURE_PMU: