<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>
"vmport",
"gic",
"smm",
- "ioapic")
+ "ioapic",
+ "hpt",
+);
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
"default",
"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)
}
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;
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;
}
}
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;
VIR_DOMAIN_FEATURE_GIC,
VIR_DOMAIN_FEATURE_SMM,
VIR_DOMAIN_FEATURE_IOAPIC,
+ VIR_DOMAIN_FEATURE_HPT,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
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;
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];
virDomainHostdevRemove;
virDomainHostdevSubsysPCIBackendTypeToString;
virDomainHostdevSubsysTypeToString;
+virDomainHPTResizingTypeToString;
virDomainHubTypeFromString;
virDomainHubTypeToString;
virDomainHypervTypeFromString;
/* 270 */
"vxhs",
"virtio-blk.num-queues",
+ "machine.pseries.resize-hpt",
);
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;
/* 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;
}
}
+ 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);
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;
}
<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>