[libvirt] [PATCH RFCv2 0/4] Add optional pSeries features

Applies on top of [req]. RFC because we still don't have a way of probing QEMU to figure out whether the relevant toggles are available. Plus, there's no documentation yet :) Changes from [RFCv1]: * don't nest features inside a <pseries/> element; * implement all optional features. [req] https://www.redhat.com/archives/libvir-list/2018-February/msg00298.html [RFCv1] https://www.redhat.com/archives/libvir-list/2018-January/msg00779.html Andrea Bolognani (4): qemu: Implement the HTM pSeries feature qemu: Implement the SBBC pSeries feature qemu: Implement the CFPC pSeries feature qemu: Implement the IBS pSeries feature docs/schemas/domaincommon.rng | 30 ++++ src/conf/domain_conf.c | 74 +++++++++ src/conf/domain_conf.h | 15 ++ src/libvirt_private.syms | 2 + src/qemu/qemu_capabilities.c | 17 +++ src/qemu/qemu_capabilities.h | 6 + src/qemu/qemu_command.c | 165 +++++++++++++++++++++ src/qemu/qemu_domain.c | 22 +++ tests/qemuxml2argvdata/pseries-features-cfpc.args | 19 +++ tests/qemuxml2argvdata/pseries-features-cfpc.xml | 28 ++++ tests/qemuxml2argvdata/pseries-features-htm.args | 19 +++ tests/qemuxml2argvdata/pseries-features-htm.xml | 28 ++++ tests/qemuxml2argvdata/pseries-features-ibs.args | 19 +++ tests/qemuxml2argvdata/pseries-features-ibs.xml | 28 ++++ .../pseries-features-invalid-machine.xml | 1 + tests/qemuxml2argvdata/pseries-features-sbbc.args | 19 +++ tests/qemuxml2argvdata/pseries-features-sbbc.xml | 28 ++++ tests/qemuxml2argvtest.c | 20 +++ tests/qemuxml2xmloutdata/pseries-features-cfpc.xml | 1 + tests/qemuxml2xmloutdata/pseries-features-htm.xml | 1 + tests/qemuxml2xmloutdata/pseries-features-ibs.xml | 1 + tests/qemuxml2xmloutdata/pseries-features-sbbc.xml | 1 + tests/qemuxml2xmltest.c | 12 ++ 23 files changed, 556 insertions(+) create mode 100644 tests/qemuxml2argvdata/pseries-features-cfpc.args create mode 100644 tests/qemuxml2argvdata/pseries-features-cfpc.xml create mode 100644 tests/qemuxml2argvdata/pseries-features-htm.args create mode 100644 tests/qemuxml2argvdata/pseries-features-htm.xml create mode 100644 tests/qemuxml2argvdata/pseries-features-ibs.args create mode 100644 tests/qemuxml2argvdata/pseries-features-ibs.xml create mode 100644 tests/qemuxml2argvdata/pseries-features-sbbc.args create mode 100644 tests/qemuxml2argvdata/pseries-features-sbbc.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-cfpc.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-htm.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-ibs.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-sbbc.xml -- 2.14.3

This is the first in a list of pSeries-specific optional features that have recently been introduced in QEMU. Along with the feature proper, some generic code that will make it easier to implement subsequent features is introduced as well. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- docs/schemas/domaincommon.rng | 5 + src/conf/domain_conf.c | 19 +++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 9 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 142 +++++++++++++++++++++ src/qemu/qemu_domain.c | 10 ++ tests/qemuxml2argvdata/pseries-features-htm.args | 19 +++ tests/qemuxml2argvdata/pseries-features-htm.xml | 28 ++++ .../pseries-features-invalid-machine.xml | 1 + tests/qemuxml2argvtest.c | 5 + tests/qemuxml2xmloutdata/pseries-features-htm.xml | 1 + tests/qemuxml2xmltest.c | 3 + 13 files changed, 244 insertions(+) create mode 100644 tests/qemuxml2argvdata/pseries-features-htm.args create mode 100644 tests/qemuxml2argvdata/pseries-features-htm.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-htm.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ee6f83c96..262f83ad7 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4797,6 +4797,11 @@ <optional> <ref name="hpt"/> </optional> + <optional> + <element name="htm"> + <ref name="featurestate"/> + </element> + </optional> <optional> <ref name="vmcoreinfo"/> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c1d549594..ea3930c5d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -152,6 +152,7 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "ioapic", "hpt", "vmcoreinfo", + "htm", ); VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, @@ -19251,6 +19252,22 @@ virDomainDefParseXML(xmlDocPtr xml, } break; + case VIR_DOMAIN_FEATURE_HTM: + if (!(tmp = virXMLPropString(nodes[i], "state"))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing state attribute '%s' of feature '%s'"), + tmp, virDomainFeatureTypeToString(val)); + goto error; + } + if ((def->features[val] = virTristateSwitchTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown state attribute '%s' of feature '%s'"), + tmp, virDomainFeatureTypeToString(val)); + goto error; + } + VIR_FREE(tmp); + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; @@ -21338,6 +21355,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, case VIR_DOMAIN_FEATURE_VMPORT: case VIR_DOMAIN_FEATURE_SMM: case VIR_DOMAIN_FEATURE_VMCOREINFO: + case VIR_DOMAIN_FEATURE_HTM: if (src->features[i] != dst->features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of feature '%s' differs: " @@ -26803,6 +26821,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, case VIR_DOMAIN_FEATURE_PVSPINLOCK: case VIR_DOMAIN_FEATURE_VMPORT: case VIR_DOMAIN_FEATURE_SMM: + case VIR_DOMAIN_FEATURE_HTM: switch ((virTristateSwitch) def->features[i]) { case VIR_TRISTATE_SWITCH_LAST: case VIR_TRISTATE_SWITCH_ABSENT: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 4e9044ae6..3a1fa1522 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1741,6 +1741,7 @@ typedef enum { VIR_DOMAIN_FEATURE_IOAPIC, VIR_DOMAIN_FEATURE_HPT, VIR_DOMAIN_FEATURE_VMCOREINFO, + VIR_DOMAIN_FEATURE_HTM, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index b5eb8cf46..c3b1f748a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -459,6 +459,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "pl011", "machine.pseries.max-cpu-compat", "dump-completed", + "machine.pseries.cap-htm", ); @@ -4896,6 +4897,14 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT); } + /* No way to query cap-* availability... Yet. See + * http://lists.nongnu.org/archive/html/qemu-devel/2018-01/msg04674.html + * for an attempt at making this introspectable through QMP */ + if (qemuCaps->version >= 2012000 && + ARCH_IS_PPC64(qemuCaps->arch)) { + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); + } + if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0) goto cleanup; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index c2ec2be19..5d9b67177 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -444,6 +444,7 @@ typedef enum { QEMU_CAPS_DEVICE_PL011, /* -device pl011 (not user-instantiable) */ QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT, /* -machine pseries,max-cpu-compat= */ QEMU_CAPS_DUMP_COMPLETED, /* DUMP_COMPLETED event */ + QEMU_CAPS_MACHINE_PSERIES_CAP_HTM, /* -machine pseries,cap-htm= */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index faf09a599..877482853 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7060,6 +7060,113 @@ qemuBuildNameCommandLine(virCommandPtr cmd, return 0; } +static int +virDomainFeatureToQEMUCaps(int feature) +{ + switch ((virDomainFeature) feature) { + case VIR_DOMAIN_FEATURE_HTM: + return QEMU_CAPS_MACHINE_PSERIES_CAP_HTM; + case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_APIC: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_HAP: + 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: + case VIR_DOMAIN_FEATURE_VMPORT: + case VIR_DOMAIN_FEATURE_GIC: + case VIR_DOMAIN_FEATURE_SMM: + case VIR_DOMAIN_FEATURE_IOAPIC: + case VIR_DOMAIN_FEATURE_HPT: + case VIR_DOMAIN_FEATURE_VMCOREINFO: + case VIR_DOMAIN_FEATURE_LAST: + break; + } + + return -1; +} + +static const char* +virDomainFeatureToMachineOption(int feature) +{ + switch ((virDomainFeature) feature) { + case VIR_DOMAIN_FEATURE_HTM: + return "cap-htm"; + case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_APIC: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_HAP: + 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: + case VIR_DOMAIN_FEATURE_VMPORT: + case VIR_DOMAIN_FEATURE_GIC: + case VIR_DOMAIN_FEATURE_SMM: + case VIR_DOMAIN_FEATURE_IOAPIC: + case VIR_DOMAIN_FEATURE_HPT: + case VIR_DOMAIN_FEATURE_VMCOREINFO: + case VIR_DOMAIN_FEATURE_LAST: + break; + } + + return NULL; +} + +static int +qemuBuildMachineCommandLineFeature(virBufferPtr buf, + virDomainFeature feature, + const char *value, + virQEMUCapsPtr qemuCaps) +{ + const char *name = virDomainFeatureTypeToString(feature); + const char *option = virDomainFeatureToMachineOption(feature); + int cap; + int ret = -1; + + if (!option) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unknown QEMU option for '%s' feature"), + name); + goto cleanup; + } + + if (!value) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid value for '%s' feature"), + name); + goto cleanup; + } + + if ((cap = virDomainFeatureToQEMUCaps(feature)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unknown QEMU capability for '%s' feature"), + name); + goto cleanup; + } + + if (!virQEMUCapsGet(qemuCaps, cap)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("'%s' feature not supported by this QEMU binary"), + name); + goto cleanup; + } + + virBufferAsprintf(buf, ",%s=%s", option, value); + + ret = 0; + + cleanup: + return ret; +} + static int qemuBuildMachineCommandLine(virCommandPtr cmd, virQEMUDriverConfigPtr cfg, @@ -7286,6 +7393,41 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, virBufferAsprintf(&buf, ",resize-hpt=%s", str); } + for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { + const char *value; + + switch ((virDomainFeature) i) { + case VIR_DOMAIN_FEATURE_HTM: + if (def->features[i] == VIR_TRISTATE_SWITCH_ABSENT) + break; + + value = virTristateSwitchTypeToString(def->features[i]); + if (qemuBuildMachineCommandLineFeature(&buf, i, value, qemuCaps) < 0) + goto cleanup; + break; + + case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_APIC: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_HAP: + 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: + case VIR_DOMAIN_FEATURE_VMPORT: + case VIR_DOMAIN_FEATURE_GIC: + case VIR_DOMAIN_FEATURE_SMM: + case VIR_DOMAIN_FEATURE_IOAPIC: + case VIR_DOMAIN_FEATURE_HPT: + case VIR_DOMAIN_FEATURE_VMCOREINFO: + case VIR_DOMAIN_FEATURE_LAST: + break; + } + } + if (cpu && cpu->model && cpu->mode == VIR_CPU_MODE_HOST_MODEL && qemuDomainIsPSeries(def) && diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 5d21d3703..906d64894 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3263,6 +3263,16 @@ qemuDomainDefValidateFeatures(const virDomainDef *def) } break; + case VIR_DOMAIN_FEATURE_HTM: + if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT && + !qemuDomainIsPSeries(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is only supported for %s guests"), + featureName, "pSeries"); + return -1; + } + break; + case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: diff --git a/tests/qemuxml2argvdata/pseries-features-htm.args b/tests/qemuxml2argvdata/pseries-features-htm.args new file mode 100644 index 000000000..64fd28ed2 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-htm.args @@ -0,0 +1,19 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest \ +-S \ +-machine pseries,accel=tcg,cap-htm=on \ +-m 512 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-boot c diff --git a/tests/qemuxml2argvdata/pseries-features-htm.xml b/tests/qemuxml2argvdata/pseries-features-htm.xml new file mode 100644 index 000000000..c47d42fe1 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-htm.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>524288</memory> + <currentMemory unit='KiB'>524288</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='ppc64' machine='pseries'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <htm state='on'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <memballoon model='none'/> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/pseries-features-invalid-machine.xml b/tests/qemuxml2argvdata/pseries-features-invalid-machine.xml index 5a6bb02d5..76cbf0737 100644 --- a/tests/qemuxml2argvdata/pseries-features-invalid-machine.xml +++ b/tests/qemuxml2argvdata/pseries-features-invalid-machine.xml @@ -9,6 +9,7 @@ <features> <!-- pSeries features can't be enabled for non-pSeries guests --> <hpt resizing='enabled'/> + <htm state='on'/> </features> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 3aa69fcee..085e3a126 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1896,6 +1896,11 @@ mymain(void) QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT); DO_TEST_FAILURE("pseries-features-hpt", QEMU_CAPS_MACHINE_OPT); + DO_TEST("pseries-features-htm", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); + DO_TEST_FAILURE("pseries-features-htm", + QEMU_CAPS_MACHINE_OPT); DO_TEST_PARSE_ERROR("pseries-features-invalid-machine", NONE); DO_TEST("pseries-serial-native", diff --git a/tests/qemuxml2xmloutdata/pseries-features-htm.xml b/tests/qemuxml2xmloutdata/pseries-features-htm.xml new file mode 120000 index 000000000..42cf0f7d7 --- /dev/null +++ b/tests/qemuxml2xmloutdata/pseries-features-htm.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/pseries-features-htm.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 0eb9e6c77..a593a59e0 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -766,6 +766,9 @@ mymain(void) DO_TEST("pseries-features-hpt", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT); + DO_TEST("pseries-features-htm", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); DO_TEST("pseries-serial-native", QEMU_CAPS_NODEFCONFIG, -- 2.14.3

This is the first pSeries-specific optional feature that is used to represent a hardware bug and to control how it will be exposed to the guest. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- docs/schemas/domaincommon.rng | 15 +++++++ src/conf/domain_conf.c | 47 ++++++++++++++++++++++ src/conf/domain_conf.h | 12 ++++++ src/libvirt_private.syms | 2 + src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 13 ++++++ src/qemu/qemu_domain.c | 10 +++++ tests/qemuxml2argvdata/pseries-features-sbbc.args | 19 +++++++++ tests/qemuxml2argvdata/pseries-features-sbbc.xml | 28 +++++++++++++ tests/qemuxml2argvtest.c | 5 +++ tests/qemuxml2xmloutdata/pseries-features-sbbc.xml | 1 + tests/qemuxml2xmltest.c | 3 ++ 13 files changed, 158 insertions(+) create mode 100644 tests/qemuxml2argvdata/pseries-features-sbbc.args create mode 100644 tests/qemuxml2argvdata/pseries-features-sbbc.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-sbbc.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 262f83ad7..8e19a687a 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4802,6 +4802,11 @@ <ref name="featurestate"/> </element> </optional> + <optional> + <element name="sbbc"> + <ref name="hwbugstate"/> + </element> + </optional> <optional> <ref name="vmcoreinfo"/> </optional> @@ -5802,6 +5807,16 @@ </attribute> </define> + <define name="hwbugstate"> + <attribute name="state"> + <choice> + <value>broken</value> + <value>workaround</value> + <value>fixed</value> + </choice> + </attribute> + </define> + <!-- Optional hypervisor extensions in their own namespace: QEmu diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ea3930c5d..fcc84dc95 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -153,6 +153,7 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "hpt", "vmcoreinfo", "htm", + "sbbc", ); VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, @@ -913,6 +914,14 @@ VIR_ENUM_IMPL(virDomainHPTResizing, "required", ); +VIR_ENUM_IMPL(virDomainHWBug, + VIR_DOMAIN_HWBUG_LAST, + "none", + "broken", + "workaround", + "fixed", +); + /* Internal mapping: subset of block job types that can be present in * <mirror> XML (remaining types are not two-phase). */ VIR_ENUM_DECL(virDomainBlockJob) @@ -19268,6 +19277,23 @@ virDomainDefParseXML(xmlDocPtr xml, VIR_FREE(tmp); break; + case VIR_DOMAIN_FEATURE_SBBC: + if (!(tmp = virXMLPropString(nodes[i], "state"))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing state attribute '%s' of feature '%s'"), + tmp, virDomainFeatureTypeToString(val)); + goto error; + } + if ((def->features[val] = virDomainHWBugTypeFromString(tmp)) < 0 || + def->features[val] == VIR_DOMAIN_HWBUG_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown state attribute '%s' of feature '%s'"), + tmp, virDomainFeatureTypeToString(val)); + goto error; + } + VIR_FREE(tmp); + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; @@ -21433,6 +21459,18 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, } break; + case VIR_DOMAIN_FEATURE_SBBC: + if (src->features[i] != dst->features[i]) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("State of feature '%s:%s' differs: " + "source: '%s', destination: '%s'"), + featureName, "state", + virDomainHWBugTypeToString(src->features[i]), + virDomainHWBugTypeToString(dst->features[i])); + return false; + } + break; + case VIR_DOMAIN_FEATURE_LAST: break; } @@ -26970,6 +27008,15 @@ virDomainDefFormatInternal(virDomainDefPtr def, virDomainHPTResizingTypeToString(def->features[i])); break; + case VIR_DOMAIN_FEATURE_SBBC: + if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) + break; + + virBufferAsprintf(buf, "<%s state='%s'/>\n", + name, + virDomainHWBugTypeToString(def->features[i])); + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3a1fa1522..ab106e900 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1742,6 +1742,7 @@ typedef enum { VIR_DOMAIN_FEATURE_HPT, VIR_DOMAIN_FEATURE_VMCOREINFO, VIR_DOMAIN_FEATURE_HTM, + VIR_DOMAIN_FEATURE_SBBC, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; @@ -1882,6 +1883,17 @@ typedef enum { VIR_ENUM_DECL(virDomainHPTResizing); +typedef enum { + VIR_DOMAIN_HWBUG_NONE = 0, + VIR_DOMAIN_HWBUG_BROKEN, + VIR_DOMAIN_HWBUG_WORKAROUND, + VIR_DOMAIN_HWBUG_FIXED, + + VIR_DOMAIN_HWBUG_LAST +} virDomainHWBug; + +VIR_ENUM_DECL(virDomainHWBug); + /* Operating system configuration data & machine / arch */ typedef struct _virDomainOSEnv virDomainOSEnv; typedef virDomainOSEnv *virDomainOSEnvPtr; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 17c3b71e0..c21346027 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -396,6 +396,8 @@ virDomainHostdevSubsysTypeToString; virDomainHPTResizingTypeToString; virDomainHubTypeFromString; virDomainHubTypeToString; +virDomainHWBugTypeFromString; +virDomainHWBugTypeToString; virDomainHypervTypeFromString; virDomainHypervTypeToString; virDomainInputBusTypeToString; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c3b1f748a..be216bccf 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -460,6 +460,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "machine.pseries.max-cpu-compat", "dump-completed", "machine.pseries.cap-htm", + "machine.pseries.cap-sbbc", ); @@ -4903,6 +4904,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, if (qemuCaps->version >= 2012000 && ARCH_IS_PPC64(qemuCaps->arch)) { virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); } if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5d9b67177..8fbfc94d5 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -445,6 +445,7 @@ typedef enum { QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT, /* -machine pseries,max-cpu-compat= */ QEMU_CAPS_DUMP_COMPLETED, /* DUMP_COMPLETED event */ QEMU_CAPS_MACHINE_PSERIES_CAP_HTM, /* -machine pseries,cap-htm= */ + QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC, /* -machine pseries,cap-sbbc= */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 877482853..c83758b77 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7066,6 +7066,8 @@ virDomainFeatureToQEMUCaps(int feature) switch ((virDomainFeature) feature) { case VIR_DOMAIN_FEATURE_HTM: return QEMU_CAPS_MACHINE_PSERIES_CAP_HTM; + case VIR_DOMAIN_FEATURE_SBBC: + return QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7096,6 +7098,8 @@ virDomainFeatureToMachineOption(int feature) switch ((virDomainFeature) feature) { case VIR_DOMAIN_FEATURE_HTM: return "cap-htm"; + case VIR_DOMAIN_FEATURE_SBBC: + return "cap-sbbc"; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7406,6 +7410,15 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, goto cleanup; break; + case VIR_DOMAIN_FEATURE_SBBC: + if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) + break; + + value = virDomainHWBugTypeToString(def->features[i]); + if (qemuBuildMachineCommandLineFeature(&buf, i, value, qemuCaps) < 0) + goto cleanup; + break; + case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 906d64894..d7ce6ed65 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3273,6 +3273,16 @@ qemuDomainDefValidateFeatures(const virDomainDef *def) } break; + case VIR_DOMAIN_FEATURE_SBBC: + if (def->features[i] != VIR_DOMAIN_HWBUG_NONE && + !qemuDomainIsPSeries(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is only supported for %s guests"), + featureName, "pSeries"); + return -1; + } + break; + case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: diff --git a/tests/qemuxml2argvdata/pseries-features-sbbc.args b/tests/qemuxml2argvdata/pseries-features-sbbc.args new file mode 100644 index 000000000..e619056b2 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-sbbc.args @@ -0,0 +1,19 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest \ +-S \ +-machine pseries,accel=tcg,cap-sbbc=broken \ +-m 512 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-boot c diff --git a/tests/qemuxml2argvdata/pseries-features-sbbc.xml b/tests/qemuxml2argvdata/pseries-features-sbbc.xml new file mode 100644 index 000000000..eac2c19ae --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-sbbc.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>524288</memory> + <currentMemory unit='KiB'>524288</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='ppc64' machine='pseries'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <sbbc state='broken'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <memballoon model='none'/> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 085e3a126..0aa4145f2 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1901,6 +1901,11 @@ mymain(void) QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); DO_TEST_FAILURE("pseries-features-htm", QEMU_CAPS_MACHINE_OPT); + DO_TEST("pseries-features-sbbc", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); + DO_TEST_FAILURE("pseries-features-sbbc", + QEMU_CAPS_MACHINE_OPT); DO_TEST_PARSE_ERROR("pseries-features-invalid-machine", NONE); DO_TEST("pseries-serial-native", diff --git a/tests/qemuxml2xmloutdata/pseries-features-sbbc.xml b/tests/qemuxml2xmloutdata/pseries-features-sbbc.xml new file mode 120000 index 000000000..0bbe53221 --- /dev/null +++ b/tests/qemuxml2xmloutdata/pseries-features-sbbc.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/pseries-features-sbbc.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index a593a59e0..05610a273 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -769,6 +769,9 @@ mymain(void) DO_TEST("pseries-features-htm", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); + DO_TEST("pseries-features-sbbc", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); DO_TEST("pseries-serial-native", QEMU_CAPS_NODEFCONFIG, -- 2.14.3

Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- docs/schemas/domaincommon.rng | 5 ++++ src/conf/domain_conf.c | 4 ++++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ src/qemu/qemu_command.c | 5 ++++ src/qemu/qemu_domain.c | 1 + tests/qemuxml2argvdata/pseries-features-cfpc.args | 19 +++++++++++++++ tests/qemuxml2argvdata/pseries-features-cfpc.xml | 28 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 5 ++++ tests/qemuxml2xmloutdata/pseries-features-cfpc.xml | 1 + tests/qemuxml2xmltest.c | 3 +++ 12 files changed, 79 insertions(+) create mode 100644 tests/qemuxml2argvdata/pseries-features-cfpc.args create mode 100644 tests/qemuxml2argvdata/pseries-features-cfpc.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-cfpc.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 8e19a687a..8c918ec0c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4807,6 +4807,11 @@ <ref name="hwbugstate"/> </element> </optional> + <optional> + <element name="cfpc"> + <ref name="hwbugstate"/> + </element> + </optional> <optional> <ref name="vmcoreinfo"/> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fcc84dc95..f894fce18 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -154,6 +154,7 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "vmcoreinfo", "htm", "sbbc", + "cfpc", ); VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, @@ -19278,6 +19279,7 @@ virDomainDefParseXML(xmlDocPtr xml, break; case VIR_DOMAIN_FEATURE_SBBC: + case VIR_DOMAIN_FEATURE_CFPC: if (!(tmp = virXMLPropString(nodes[i], "state"))) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("missing state attribute '%s' of feature '%s'"), @@ -21460,6 +21462,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, break; case VIR_DOMAIN_FEATURE_SBBC: + case VIR_DOMAIN_FEATURE_CFPC: if (src->features[i] != dst->features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of feature '%s:%s' differs: " @@ -27009,6 +27012,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, break; case VIR_DOMAIN_FEATURE_SBBC: + case VIR_DOMAIN_FEATURE_CFPC: if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ab106e900..13ac63cf2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1743,6 +1743,7 @@ typedef enum { VIR_DOMAIN_FEATURE_VMCOREINFO, VIR_DOMAIN_FEATURE_HTM, VIR_DOMAIN_FEATURE_SBBC, + VIR_DOMAIN_FEATURE_CFPC, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index be216bccf..32ad58036 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -461,6 +461,9 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "dump-completed", "machine.pseries.cap-htm", "machine.pseries.cap-sbbc", + + /* 285 */ + "machine.pseries.cap-cfpc", ); @@ -4905,6 +4908,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, ARCH_IS_PPC64(qemuCaps->arch)) { virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); } if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 8fbfc94d5..226c5e3af 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -447,6 +447,9 @@ typedef enum { QEMU_CAPS_MACHINE_PSERIES_CAP_HTM, /* -machine pseries,cap-htm= */ QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC, /* -machine pseries,cap-sbbc= */ + /* 285 */ + QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC , /* -machine pseries,cap-cfpc= */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c83758b77..7ce6dfa77 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7068,6 +7068,8 @@ virDomainFeatureToQEMUCaps(int feature) return QEMU_CAPS_MACHINE_PSERIES_CAP_HTM; case VIR_DOMAIN_FEATURE_SBBC: return QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC; + case VIR_DOMAIN_FEATURE_CFPC: + return QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7100,6 +7102,8 @@ virDomainFeatureToMachineOption(int feature) return "cap-htm"; case VIR_DOMAIN_FEATURE_SBBC: return "cap-sbbc"; + case VIR_DOMAIN_FEATURE_CFPC: + return "cap-cfpc"; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7411,6 +7415,7 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, break; case VIR_DOMAIN_FEATURE_SBBC: + case VIR_DOMAIN_FEATURE_CFPC: if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d7ce6ed65..eefea56fb 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3274,6 +3274,7 @@ qemuDomainDefValidateFeatures(const virDomainDef *def) break; case VIR_DOMAIN_FEATURE_SBBC: + case VIR_DOMAIN_FEATURE_CFPC: if (def->features[i] != VIR_DOMAIN_HWBUG_NONE && !qemuDomainIsPSeries(def)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/tests/qemuxml2argvdata/pseries-features-cfpc.args b/tests/qemuxml2argvdata/pseries-features-cfpc.args new file mode 100644 index 000000000..c1ed0c1dc --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-cfpc.args @@ -0,0 +1,19 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest \ +-S \ +-machine pseries,accel=tcg,cap-cfpc=workaround \ +-m 512 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-boot c diff --git a/tests/qemuxml2argvdata/pseries-features-cfpc.xml b/tests/qemuxml2argvdata/pseries-features-cfpc.xml new file mode 100644 index 000000000..f30bad7f9 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-cfpc.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>524288</memory> + <currentMemory unit='KiB'>524288</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='ppc64' machine='pseries'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <cfpc state='workaround'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <memballoon model='none'/> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 0aa4145f2..649598c22 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1906,6 +1906,11 @@ mymain(void) QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); DO_TEST_FAILURE("pseries-features-sbbc", QEMU_CAPS_MACHINE_OPT); + DO_TEST("pseries-features-cfpc", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); + DO_TEST_FAILURE("pseries-features-cfpc", + QEMU_CAPS_MACHINE_OPT); DO_TEST_PARSE_ERROR("pseries-features-invalid-machine", NONE); DO_TEST("pseries-serial-native", diff --git a/tests/qemuxml2xmloutdata/pseries-features-cfpc.xml b/tests/qemuxml2xmloutdata/pseries-features-cfpc.xml new file mode 120000 index 000000000..fb3b1f05a --- /dev/null +++ b/tests/qemuxml2xmloutdata/pseries-features-cfpc.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/pseries-features-cfpc.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 05610a273..e5ff51867 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -772,6 +772,9 @@ mymain(void) DO_TEST("pseries-features-sbbc", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); + DO_TEST("pseries-features-cfpc", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); DO_TEST("pseries-serial-native", QEMU_CAPS_NODEFCONFIG, -- 2.14.3

Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- docs/schemas/domaincommon.rng | 5 ++++ src/conf/domain_conf.c | 4 ++++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 5 ++++ src/qemu/qemu_domain.c | 1 + tests/qemuxml2argvdata/pseries-features-ibs.args | 19 +++++++++++++++ tests/qemuxml2argvdata/pseries-features-ibs.xml | 28 +++++++++++++++++++++++ tests/qemuxml2argvtest.c | 5 ++++ tests/qemuxml2xmloutdata/pseries-features-ibs.xml | 1 + tests/qemuxml2xmltest.c | 3 +++ 12 files changed, 75 insertions(+) create mode 100644 tests/qemuxml2argvdata/pseries-features-ibs.args create mode 100644 tests/qemuxml2argvdata/pseries-features-ibs.xml create mode 120000 tests/qemuxml2xmloutdata/pseries-features-ibs.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 8c918ec0c..b9a5add3c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4812,6 +4812,11 @@ <ref name="hwbugstate"/> </element> </optional> + <optional> + <element name="ibs"> + <ref name="hwbugstate"/> + </element> + </optional> <optional> <ref name="vmcoreinfo"/> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f894fce18..515d035ec 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -155,6 +155,7 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "htm", "sbbc", "cfpc", + "ibs", ); VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, @@ -19280,6 +19281,7 @@ virDomainDefParseXML(xmlDocPtr xml, case VIR_DOMAIN_FEATURE_SBBC: case VIR_DOMAIN_FEATURE_CFPC: + case VIR_DOMAIN_FEATURE_IBS: if (!(tmp = virXMLPropString(nodes[i], "state"))) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("missing state attribute '%s' of feature '%s'"), @@ -21463,6 +21465,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, case VIR_DOMAIN_FEATURE_SBBC: case VIR_DOMAIN_FEATURE_CFPC: + case VIR_DOMAIN_FEATURE_IBS: if (src->features[i] != dst->features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of feature '%s:%s' differs: " @@ -27013,6 +27016,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, case VIR_DOMAIN_FEATURE_SBBC: case VIR_DOMAIN_FEATURE_CFPC: + case VIR_DOMAIN_FEATURE_IBS: if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 13ac63cf2..a0b553d6e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1744,6 +1744,7 @@ typedef enum { VIR_DOMAIN_FEATURE_HTM, VIR_DOMAIN_FEATURE_SBBC, VIR_DOMAIN_FEATURE_CFPC, + VIR_DOMAIN_FEATURE_IBS, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 32ad58036..a520394d3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -464,6 +464,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, /* 285 */ "machine.pseries.cap-cfpc", + "machine.pseries.cap-ibs", ); @@ -4909,6 +4910,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_HTM); virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC); virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_PSERIES_CAP_IBS); } if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 226c5e3af..509d9d3a0 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -449,6 +449,7 @@ typedef enum { /* 285 */ QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC , /* -machine pseries,cap-cfpc= */ + QEMU_CAPS_MACHINE_PSERIES_CAP_IBS , /* -machine pseries,cap-ibs= */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7ce6dfa77..2f1aa803b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7070,6 +7070,8 @@ virDomainFeatureToQEMUCaps(int feature) return QEMU_CAPS_MACHINE_PSERIES_CAP_SBBC; case VIR_DOMAIN_FEATURE_CFPC: return QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC; + case VIR_DOMAIN_FEATURE_IBS: + return QEMU_CAPS_MACHINE_PSERIES_CAP_IBS; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7104,6 +7106,8 @@ virDomainFeatureToMachineOption(int feature) return "cap-sbbc"; case VIR_DOMAIN_FEATURE_CFPC: return "cap-cfpc"; + case VIR_DOMAIN_FEATURE_IBS: + return "cap-ibs"; case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_APIC: case VIR_DOMAIN_FEATURE_PAE: @@ -7416,6 +7420,7 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, case VIR_DOMAIN_FEATURE_SBBC: case VIR_DOMAIN_FEATURE_CFPC: + case VIR_DOMAIN_FEATURE_IBS: if (def->features[i] == VIR_DOMAIN_HWBUG_NONE) break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index eefea56fb..bd9857b26 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3275,6 +3275,7 @@ qemuDomainDefValidateFeatures(const virDomainDef *def) case VIR_DOMAIN_FEATURE_SBBC: case VIR_DOMAIN_FEATURE_CFPC: + case VIR_DOMAIN_FEATURE_IBS: if (def->features[i] != VIR_DOMAIN_HWBUG_NONE && !qemuDomainIsPSeries(def)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/tests/qemuxml2argvdata/pseries-features-ibs.args b/tests/qemuxml2argvdata/pseries-features-ibs.args new file mode 100644 index 000000000..cf1ae92c9 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-ibs.args @@ -0,0 +1,19 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest \ +-S \ +-machine pseries,accel=tcg,cap-ibs=fixed \ +-m 512 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-boot c diff --git a/tests/qemuxml2argvdata/pseries-features-ibs.xml b/tests/qemuxml2argvdata/pseries-features-ibs.xml new file mode 100644 index 000000000..4aac368e2 --- /dev/null +++ b/tests/qemuxml2argvdata/pseries-features-ibs.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>524288</memory> + <currentMemory unit='KiB'>524288</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='ppc64' machine='pseries'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <ibs state='fixed'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <memballoon model='none'/> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 649598c22..0faa1d4fa 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1911,6 +1911,11 @@ mymain(void) QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); DO_TEST_FAILURE("pseries-features-cfpc", QEMU_CAPS_MACHINE_OPT); + DO_TEST("pseries-features-ibs", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_IBS); + DO_TEST_FAILURE("pseries-features-ibs", + QEMU_CAPS_MACHINE_OPT); DO_TEST_PARSE_ERROR("pseries-features-invalid-machine", NONE); DO_TEST("pseries-serial-native", diff --git a/tests/qemuxml2xmloutdata/pseries-features-ibs.xml b/tests/qemuxml2xmloutdata/pseries-features-ibs.xml new file mode 120000 index 000000000..278c88e48 --- /dev/null +++ b/tests/qemuxml2xmloutdata/pseries-features-ibs.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/pseries-features-ibs.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index e5ff51867..095792a64 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -775,6 +775,9 @@ mymain(void) DO_TEST("pseries-features-cfpc", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_PSERIES_CAP_CFPC); + DO_TEST("pseries-features-ibs", + QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_PSERIES_CAP_IBS); DO_TEST("pseries-serial-native", QEMU_CAPS_NODEFCONFIG, -- 2.14.3

On Tue, Feb 06, 2018 at 17:54:55 +0100, Andrea Bolognani wrote:
Applies on top of [req].
RFC because we still don't have a way of probing QEMU to figure out whether the relevant toggles are available. Plus, there's no documentation yet :)
I wanted to moan about missing docs and sub-par commit messages but okay. Note that without documentation it's not possible to scrunitize whether it makes any particular sense to expose a given feature at all. Since probing is not implemented I don't think it makes sense to introduce cabapility bits for every single feature since they are grouped under the same version check. Even if qemu adds QMP probing of these the capability check will not go away since it would create a regression in behaviour. This means that you can remove all the capability bits and group all of them under a single one since they will only ever be enabled using that version check. Also I really don't think that every single feature should have it's own XML document to test it. You can gradually add them to a single one and test that all are added.

On Tue, 2018-02-06 at 21:25 +0100, Peter Krempa wrote:
On Tue, Feb 06, 2018 at 17:54:55 +0100, Andrea Bolognani wrote:
Applies on top of [req].
RFC because we still don't have a way of probing QEMU to figure out whether the relevant toggles are available. Plus, there's no documentation yet :)
I wanted to moan about missing docs and sub-par commit messages but okay. Note that without documentation it's not possible to scrunitize whether it makes any particular sense to expose a given feature at all.
See https://bugzilla.redhat.com/show_bug.cgi?id=1525599#c4 for a rationale on having the toggles. The previous comment lists all QEMU-level toggles, and as you can see we're not implementing either VSX or DFP because they don't have a clear use case.
Since probing is not implemented I don't think it makes sense to introduce cabapility bits for every single feature since they are grouped under the same version check.
Even if qemu adds QMP probing of these the capability check will not go away since it would create a regression in behaviour. This means that you can remove all the capability bits and group all of them under a single one since they will only ever be enabled using that version check.
The capabilities have been introduced during the 2.12 development cycle, so assuming QMP probing makes it into that release we should definitely use that instead of performing a version check. If it doesn't then yeah, a version check will probably be better in order not to artificially block perfectly good QEMU binaries from using the capabilites. It would still not be a regression, though.
Also I really don't think that every single feature should have it's own XML document to test it. You can gradually add them to a single one and test that all are added.
Good point, I'll merge them. -- Andrea Bolognani / Red Hat / Virtualization
participants (2)
-
Andrea Bolognani
-
Peter Krempa