]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Enable configuration of HPT resizing for pSeries guests
authorAndrea Bolognani <abologna@redhat.com>
Mon, 6 Nov 2017 15:39:40 +0000 (16:39 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Tue, 14 Nov 2017 15:29:55 +0000 (16:29 +0100)
Most of the time it's okay to leave this up to negotiation between
the guest and the host, but in some situations it can be useful to
manually decide the behavior, especially to enforce its availability.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1308743

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml

index 9cec1a06372480ce4800cd2a93e646c95809a843..82fdfd5f73a9b6139ef23f4e5aa251d36be64e63 100644 (file)
           <optional>
             <ref name="ioapic"/>
           </optional>
+          <optional>
+            <ref name="hpt"/>
+          </optional>
         </interleave>
       </element>
     </optional>
     </element>
   </define>
 
+  <define name="hpt">
+    <element name="hpt">
+      <attribute name="resizing">
+        <choice>
+          <value>enabled</value>
+          <value>disabled</value>
+          <value>required</value>
+        </choice>
+      </attribute>
+    </element>
+  </define>
+
   <define name="address">
     <element name="address">
       <choice>
index fffcc8e9da5a864ae70917b72f9f092b41e5d1b2..62d0a1683a6e2be0323b0eff679d2e1126a3642b 100644 (file)
@@ -148,7 +148,9 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
               "vmport",
               "gic",
               "smm",
-              "ioapic")
+              "ioapic",
+              "hpt",
+);
 
 VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
               "default",
@@ -882,6 +884,13 @@ VIR_ENUM_IMPL(virDomainIOAPIC,
               "qemu",
               "kvm")
 
+VIR_ENUM_IMPL(virDomainHPTResizing,
+              VIR_DOMAIN_HPT_RESIZING_LAST,
+              "enabled",
+              "disabled",
+              "required",
+);
+
 /* Internal mapping: subset of block job types that can be present in
  * <mirror> XML (remaining types are not two-phase). */
 VIR_ENUM_DECL(virDomainBlockJob)
@@ -18775,6 +18784,22 @@ virDomainDefParseXML(xmlDocPtr xml,
             }
             break;
 
+        case VIR_DOMAIN_FEATURE_HPT:
+            tmp = virXMLPropString(nodes[i], "resizing");
+            if (tmp) {
+                int value = virDomainHPTResizingTypeFromString(tmp);
+                if (value < 0) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                   _("Unknown HPT resizing setting: %s"),
+                                   tmp);
+                    goto error;
+                }
+                def->hpt_resizing = value;
+                def->features[val] = VIR_TRISTATE_SWITCH_ON;
+                VIR_FREE(tmp);
+            }
+            break;
+
         /* coverity[dead_error_begin] */
         case VIR_DOMAIN_FEATURE_LAST:
             break;
@@ -20965,6 +20990,18 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
         return false;
     }
 
+    /* HPT resizing */
+    if (src->features[VIR_DOMAIN_FEATURE_HPT] == VIR_TRISTATE_SWITCH_ON) {
+        if (src->hpt_resizing != dst->hpt_resizing) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("HPT resizing configuration differs: "
+                             "source: '%s', destination: '%s'"),
+                           virDomainHPTResizingTypeToString(src->hpt_resizing),
+                           virDomainHPTResizingTypeToString(dst->hpt_resizing));
+            return false;
+        }
+    }
+
     return true;
 }
 
@@ -26214,6 +26251,13 @@ virDomainDefFormatInternal(virDomainDefPtr def,
                 }
                 break;
 
+            case VIR_DOMAIN_FEATURE_HPT:
+                if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
+                    virBufferAsprintf(buf, "<hpt resizing='%s'/>\n",
+                                      virDomainHPTResizingTypeToString(def->hpt_resizing));
+                }
+                break;
+
             /* coverity[dead_error_begin] */
             case VIR_DOMAIN_FEATURE_LAST:
                 break;
index e3f060b122b429f9de9cac051dfbaf1c4a62b8f6..41443a02c93140dd38cdc8ffa9f72ae2db5ce07f 100644 (file)
@@ -1723,6 +1723,7 @@ typedef enum {
     VIR_DOMAIN_FEATURE_GIC,
     VIR_DOMAIN_FEATURE_SMM,
     VIR_DOMAIN_FEATURE_IOAPIC,
+    VIR_DOMAIN_FEATURE_HPT,
 
     VIR_DOMAIN_FEATURE_LAST
 } virDomainFeature;
@@ -1851,6 +1852,16 @@ typedef enum {
 
 VIR_ENUM_DECL(virDomainIOAPIC);
 
+typedef enum {
+    VIR_DOMAIN_HPT_RESIZING_ENABLED = 0,
+    VIR_DOMAIN_HPT_RESIZING_DISABLED,
+    VIR_DOMAIN_HPT_RESIZING_REQUIRED,
+
+    VIR_DOMAIN_HPT_RESIZING_LAST
+} virDomainHPTResizing;
+
+VIR_ENUM_DECL(virDomainHPTResizing);
+
 /* Operating system configuration data & machine / arch */
 typedef struct _virDomainOSEnv virDomainOSEnv;
 typedef virDomainOSEnv *virDomainOSEnvPtr;
@@ -2323,6 +2334,7 @@ struct _virDomainDef {
     virGICVersion gic_version;
     char *hyperv_vendor_id;
     virDomainIOAPIC ioapic;
+    virDomainHPTResizing hpt_resizing;
 
     /* These options are of type virTristateSwitch: ON = keep, OFF = drop */
     int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];
index 5a4d50471d77bb859fd2af4f8b1e87ab712d0f66..a91b87d09ade2ed645a72ffa7e47816c0776e9b4 100644 (file)
@@ -387,6 +387,7 @@ virDomainHostdevModeTypeToString;
 virDomainHostdevRemove;
 virDomainHostdevSubsysPCIBackendTypeToString;
 virDomainHostdevSubsysTypeToString;
+virDomainHPTResizingTypeToString;
 virDomainHubTypeFromString;
 virDomainHubTypeToString;
 virDomainHypervTypeFromString;
index 7cb091056b486546e9e022fdc8a6660f33511f59..1badadbc2e477e6b5b3791095726caa7023accb1 100644 (file)
@@ -443,6 +443,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               /* 270 */
               "vxhs",
               "virtio-blk.num-queues",
+              "machine.pseries.resize-hpt",
     );
 
 
@@ -4776,6 +4777,13 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
     if (qemuCaps->version >= 2006000)
         virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT);
 
+    /* HPT resizing is supported since QEMU 2.10 on ppc64; unfortunately
+     * there's no sane way to probe for it */
+    if (qemuCaps->version >= 2010000 &&
+        ARCH_IS_PPC64(qemuCaps->arch)) {
+        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT);
+    }
+
     if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
         goto cleanup;
 
index cacc2b77ed37f0d8f76093f6a930abf3039fcbd0..f0e2e9016fa3d463d5f41e0904567b0ab456b003 100644 (file)
@@ -429,6 +429,7 @@ typedef enum {
     /* 270 */
     QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */
     QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES, /* virtio-blk-*.num-queues */
+    QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT, /* -machine pseries,resize-hpt */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
index eb72db33ba52e0a8b4be14108d25bde2ec5031c0..56729e4981e047ab5be13f1bf655d22471ff0ad8 100644 (file)
@@ -7489,6 +7489,26 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
             }
         }
 
+        if (def->features[VIR_DOMAIN_FEATURE_HPT] == VIR_TRISTATE_SWITCH_ON) {
+            const char *str;
+
+            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("HTP resizing is not supported by this "
+                                 "QEMU binary"));
+                goto cleanup;
+            }
+
+            str = virDomainHPTResizingTypeToString(def->hpt_resizing);
+            if (!str) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Invalid setting for HPT resizing"));
+                goto cleanup;
+            }
+
+            virBufferAsprintf(&buf, ",resize-hpt=%s", str);
+        }
+
         if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX) &&
             virQEMUCapsGet(qemuCaps, QEMU_CAPS_LOADPARM))
             qemuAppendLoadparmMachineParm(&buf, def);
index a36e157529466b7a206c95d052ad1a1a1723ba8b..cc7596bad108ea3a2c369378e7b9deb615034f61 100644 (file)
@@ -3144,6 +3144,14 @@ qemuDomainDefVerifyFeatures(const virDomainDef *def)
         return -1;
     }
 
+    if (def->features[VIR_DOMAIN_FEATURE_HPT] == VIR_TRISTATE_SWITCH_ON &&
+        !qemuDomainIsPSeries(def)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       "%s",
+                       _("HPT tuning is only supported for pSeries guests"));
+        return -1;
+    }
+
     return 0;
 }
 
index 0dfa20726c413725a3a6c2bc9bc6418069bd0e05..b0ee3f15232eedf95dea55e97c23d40532f42ba0 100644 (file)
   <flag name='virtio-gpu.max_outputs'/>
   <flag name='vxhs'/>
   <flag name='virtio-blk.num-queues'/>
+  <flag name='machine.pseries.resize-hpt'/>
   <version>2010000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.10.0)</package>