From d47db7b16dd5422c7e487c8c8ee5b181a2f9cd66 Mon Sep 17 00:00:00 2001 From: "Collin L. Walling" Date: Sun, 18 Dec 2016 14:22:29 -0500 Subject: [PATCH] qemu: command: Support new cpu feature argument syntax Qemu has abandoned the +/-feature syntax in favor of key=value. Some architectures (s390) do not support +/-feature. So we update libvirt to handle both formats. If we detect a sufficiently new Qemu (indicated by support for qmp query-cpu-model-expansion) we use key=value else we fall back to +/-feature. Signed-off-by: Collin L. Walling Signed-off-by: Jason J. Herne --- src/qemu/qemu_command.c | 18 +++++++++++++-- .../qemuxml2argv-cpu-s390-features.args | 19 +++++++++++++++ .../qemuxml2argv-cpu-s390-features.xml | 23 +++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 28d8146624..e50cca4701 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6664,6 +6664,14 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, break; } + if (ARCH_IS_S390(def->os.arch) && cpu->features && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("CPU features not supported by hypervisor for %s " + "architecture"), virArchToString(def->os.arch)); + goto cleanup; + } + if (cpu->vendor_id) virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id); @@ -6671,12 +6679,18 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, switch ((virCPUFeaturePolicy) cpu->features[i].policy) { case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: - virBufferAsprintf(buf, ",+%s", cpu->features[i].name); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) + virBufferAsprintf(buf, ",%s=on", cpu->features[i].name); + else + virBufferAsprintf(buf, ",+%s", cpu->features[i].name); break; case VIR_CPU_FEATURE_DISABLE: case VIR_CPU_FEATURE_FORBID: - virBufferAsprintf(buf, ",-%s", cpu->features[i].name); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) + virBufferAsprintf(buf, ",%s=off", cpu->features[i].name); + else + virBufferAsprintf(buf, ",-%s", cpu->features[i].name); break; case VIR_CPU_FEATURE_OPTIONAL: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.args new file mode 100644 index 0000000000..07abc93b01 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.args @@ -0,0 +1,19 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-kvm \ +-name guest1 \ +-S \ +-M s390-ccw-virtio \ +-cpu zEC12,dfppc=on,stckf=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-monitor unix:/tmp/lib/domain--1-guest1/monitor.sock,server,nowait \ +-no-acpi \ +-boot c diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.xml new file mode 100644 index 0000000000..47279c4d69 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-s390-features.xml @@ -0,0 +1,23 @@ + + guest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + destroy + restart + destroy + + zEC12 + + + + + /usr/bin/qemu-kvm + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 04534e3bcd..8230c26840 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1530,6 +1530,8 @@ mymain(void) qemuTestSetHostArch(driver.caps, VIR_ARCH_S390X); DO_TEST("cpu-s390-zEC12", QEMU_CAPS_KVM, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); + DO_TEST("cpu-s390-features", QEMU_CAPS_KVM, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION); + DO_TEST_FAILURE("cpu-s390-features", QEMU_CAPS_KVM); qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE); qemuTestSetHostCPU(driver.caps, cpuHaswell);