From 21442874cf61ce61c7e0f8bcd616641f35adda2b Mon Sep 17 00:00:00 2001 From: Shalini Chellathurai Saroja Date: Mon, 7 May 2018 16:41:15 +0200 Subject: [PATCH] qemu: command line generation for vfio-ccw device Generates the QEMU command line for the vfio-ccw device. Adds various functionality testing for vfio-ccw in libvirt: 1. Generation of QEMU command line from domain xml file 2. Generation of dump xml from domain xml file 3. Checks duplicate/invalid addresses for vfio-ccw devices. Signed-off-by: Shalini Chellathurai Saroja Reviewed-by: Bjoern Walk Reviewed-by: Boris Fiuczynski Reviewed-by: Marc Hartmayer Reviewed-by: Stefan Zimmermann Reviewed-by: John Ferlan --- src/qemu/qemu_command.c | 33 ++++++++++++++++--- ...subsys-mdev-vfio-ccw-duplicate-address.xml | 29 ++++++++++++++++ ...v-subsys-mdev-vfio-ccw-invalid-address.xml | 23 +++++++++++++ .../hostdev-subsys-mdev-vfio-ccw.args | 26 +++++++++++++++ tests/qemuxml2argvtest.c | 16 +++++++++ 5 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml create mode 100644 tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 253f7067cf..0727361f19 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5103,11 +5103,17 @@ qemuBuildHostdevMediatedDevStr(const virDomainDef *def, virDomainHostdevSubsysMediatedDevPtr mdevsrc = &dev->source.subsys.u.mdev; char *ret = NULL; char *mdevPath = NULL; + const char *dev_str = NULL; if (!(mdevPath = virMediatedDeviceGetSysfsPath(mdevsrc->uuidstr))) goto cleanup; - virBufferAddLit(&buf, "vfio-pci"); + dev_str = virMediatedDeviceModelTypeToString(mdevsrc->model); + + if (!dev_str) + goto cleanup; + + virBufferAdd(&buf, dev_str, -1); virBufferAsprintf(&buf, ",id=%s,sysfsdev=%s", dev->info->alias, mdevPath); if (qemuBuildDeviceAddressStr(&buf, def, dev->info, qemuCaps) < 0) @@ -5327,11 +5333,28 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd, /* MDEV */ if (virHostdevIsMdevDevice(hostdev)) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("VFIO PCI device assignment is not " - "supported by this version of qemu")); + switch ((virMediatedDeviceModelType) subsys->u.mdev.model) { + case VIR_MDEV_MODEL_TYPE_VFIO_PCI: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VFIO PCI device assignment is not " + "supported by this version of QEMU")); + return -1; + } + break; + case VIR_MDEV_MODEL_TYPE_VFIO_CCW: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("VFIO CCW device assignment is not " + "supported by this version of QEMU")); + return -1; + } + break; + case VIR_MDEV_MODEL_TYPE_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected vfio type '%d'"), subsys->u.mdev.model); return -1; + break; } virCommandAddArg(cmd, "-device"); diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml new file mode 100644 index 0000000000..4b95fe277c --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-duplicate-address.xml @@ -0,0 +1,29 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 524288 + 524288 + 2 + + hvm + + + destroy + restart + destroy + + /usr/bin/qemu-system-s390x + + +
+ +
+ + + +
+ +
+ + + diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml new file mode 100644 index 0000000000..680090e2b0 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw-invalid-address.xml @@ -0,0 +1,23 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 524288 + 524288 + 2 + + hvm + + + destroy + restart + destroy + + /usr/bin/qemu-system-s390x + + +
+ +
+ + + diff --git a/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args new file mode 100644 index 0000000000..56ebf9adbb --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-subsys-mdev-vfio-ccw.args @@ -0,0 +1,26 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 512 \ +-smp 2,sockets=2,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot c \ +-device vfio-ccw,id=hostdev0,\ +sysfsdev=/sys/bus/mdev/devices/90c6c135-ad44-41d0-b1b7-bae47de48627,\ +devno=fe.0.0000 \ +-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0001 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index cf3151f7ca..042ee12aaa 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1542,6 +1542,22 @@ mymain(void) DO_TEST("pci-rom-disabled", NONE); DO_TEST("pci-rom-disabled-invalid", NONE); + DO_TEST("hostdev-subsys-mdev-vfio-ccw", + QEMU_CAPS_CCW, + QEMU_CAPS_CCW_CSSID_UNRESTRICTED, + QEMU_CAPS_DEVICE_VFIO_CCW); + DO_TEST_FAILURE("hostdev-subsys-mdev-vfio-ccw", + QEMU_CAPS_CCW, + QEMU_CAPS_CCW_CSSID_UNRESTRICTED); + DO_TEST_PARSE_ERROR("hostdev-subsys-mdev-vfio-ccw-duplicate-address", + QEMU_CAPS_CCW, + QEMU_CAPS_CCW_CSSID_UNRESTRICTED, + QEMU_CAPS_DEVICE_VFIO_CCW); + DO_TEST_PARSE_ERROR("hostdev-subsys-mdev-vfio-ccw-invalid-address", + QEMU_CAPS_CCW, + QEMU_CAPS_CCW_CSSID_UNRESTRICTED, + QEMU_CAPS_DEVICE_VFIO_CCW); + DO_TEST_FULL("restore-v2", "exec:cat", 7, 0, 0, GIC_NONE, NONE); DO_TEST_FULL("restore-v2-fd", "stdio", 7, 0, 0, GIC_NONE, NONE); DO_TEST_FULL("restore-v2-fd", "fd:7", 7, 0, 0, GIC_NONE, NONE);