Signed-off-by: Olivia Yin <Hong-Hua.Yin@xxxxxxxxxxxxx> Signed-off-by: Laine Stump <laine@xxxxxxxxx> Modify the existing function qemuParseCommandLinePCI(), which works with -pcidevice, to support for "-device pci-assign" and "-device pci-assign". Change test cases 'hostdev-vfio' and 'hostdev-pci-address-device' to validate the new function. The case related to QEMU_CAPS_HOST_PCI_MULTIDOMAIN which uses 'host=domain:bus:slot.func' is not supported yet. --- src/qemu/qemu_command.c | 50 +++++++++++++++++++--- tests/qemuargv2xmltest.c | 3 +- .../qemuxml2argv-hostdev-pci-address-device.xml | 6 +++ .../qemuxml2argvdata/qemuxml2argv-hostdev-vfio.xml | 1 + 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e1d7e1b..3a4bc61 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10193,7 +10193,8 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt, * Tries to parse a QEMU PCI device */ static virDomainHostdevDefPtr -qemuParseCommandLinePCI(const char *val) +qemuParseCommandLinePCI(const char *val, + virDomainHostdevSubsysPCIBackendType backend) { int bus = 0, slot = 0, func = 0; const char *start; @@ -10222,10 +10223,20 @@ qemuParseCommandLinePCI(const char *val) goto error; } start = end + 1; - if (virStrToLong_i(start, NULL, 16, &func) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot extract PCI device function '%s'"), val); - goto error; + + if (backend) { + if (virStrToLong_i(start, &end, 16, &func) < 0 || *end != ',') { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot extract PCI device function '%s'"), val); + goto error; + } else + def->source.subsys.u.pci.backend = backend; + } else { + if (virStrToLong_i(start, NULL, 16, &func) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot extract PCI device function '%s'"), val); + goto error; + } } def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; @@ -11347,7 +11358,34 @@ qemuParseCommandLine(virCapsPtr qemuCaps, } else if (STREQ(arg, "-pcidevice")) { virDomainHostdevDefPtr hostdev; WANT_VALUE(); - if (!(hostdev = qemuParseCommandLinePCI(val))) + if (!(hostdev = qemuParseCommandLinePCI(val, + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT))) + goto error; + if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0) { + virDomainHostdevDefFree(hostdev); + goto error; + } + } else if (STREQ(arg, "-device") && progargv[i+1] && + STRPREFIX(progargv[i+1], "vfio-pci")) { + const char *start; + virDomainHostdevDefPtr hostdev; + WANT_VALUE(); + start = val + strlen("vfio-pci,"); + if (!(hostdev = qemuParseCommandLinePCI(start, + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO))) + goto error; + if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0) { + virDomainHostdevDefFree(hostdev); + goto error; + } + } else if (STREQ(arg, "-device") && progargv[i+1] && + STRPREFIX(progargv[i+1], "pci-assign")) { + const char *start; + virDomainHostdevDefPtr hostdev; + WANT_VALUE(); + start = val + strlen("pci-assign,"); + if (!(hostdev = qemuParseCommandLinePCI(start, + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM))) goto error; if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0) { virDomainHostdevDefFree(hostdev); diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 2cbbe3d..80188be 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -274,8 +274,9 @@ mymain(void) DO_TEST("watchdog"); DO_TEST("hostdev-usb-address"); - DO_TEST("hostdev-pci-address"); + DO_TEST("hostdev-pci-address-device"); + DO_TEST("hostdev-vfio"); DO_TEST("smp"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml index b29ef58..b9a221a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.xml @@ -15,10 +15,16 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <hostdev mode='subsystem' type='pci' managed='yes'> + <driver name='kvm'/> <source> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/> </source> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.xml index 8daa53a..b99f798 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> -- 1.8.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list