To allow for better code reuse from hotplug methods, the code for generating PCI/USB hostdev arg values is split out into separate methods * qemu/qemu_conf.h, qemu/qemu_conf.c: Introduce new APis for qemuBuildPCIHostdevPCIDevStr, qemuBuildUSBHostdevUsbDevStr and qemuBuildUSBHostdevDevStr --- src/qemu/qemu_conf.c | 105 +++++++++++++++++++++++++++++++++---------------- src/qemu/qemu_conf.h | 10 +++++ 2 files changed, 81 insertions(+), 34 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 232dc5d..bbf49fd 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -2506,6 +2506,65 @@ error: } +char * +qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev) +{ + char *ret = NULL; + + if (virAsprintf(&ret, "host=%.2x:%.2x.%.1x", + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function) < 0) + virReportOOMError(NULL); + + return ret; +} + + +char * +qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev) +{ + char *ret = NULL; + + if (!dev->source.subsys.u.usb.bus && + !dev->source.subsys.u.usb.device) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s", + _("USB host device is missing bus/device information")); + return NULL; + } + + if (virAsprintf(&ret, "usb-host,hostbus=%.3d,hostaddr=%.3d,id=%s", + dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + dev->info.alias) < 0) + virReportOOMError(NULL); + + return ret; +} + + +char * +qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev) +{ + char *ret = NULL; + + if (!dev->source.subsys.u.usb.bus && + !dev->source.subsys.u.usb.device) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s", + _("USB host device is missing bus/device information")); + return NULL; + } + + if (virAsprintf(&ret, "host:%.3d.%.3d", + dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device) < 0) + virReportOOMError(NULL); + + return ret; +} + + + /* This function outputs a -chardev command line option which describes only the * host side of the character device */ char * @@ -3758,10 +3817,8 @@ int qemudBuildCommandLine(virConnectPtr conn, /* Add host passthrough hardware */ for (i = 0 ; i < def->nhostdevs ; i++) { - int ret; - char* usbdev; - char* pcidev; virDomainHostdevDefPtr hostdev = def->hostdevs[i]; + char *devstr; /* USB */ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && @@ -3769,33 +3826,15 @@ int qemudBuildCommandLine(virConnectPtr conn, if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) { ADD_ARG_LIT("-device"); - if (hostdev->source.subsys.u.usb.vendor) { - ret = virAsprintf(&usbdev, "usb-host,vendor=%.4x,product=%.4x,id=%s", - hostdev->source.subsys.u.usb.vendor, - hostdev->source.subsys.u.usb.product, - hostdev->info.alias); - } else { - ret = virAsprintf(&usbdev, "usb-host,hostbus=%.3d,hostaddr=%.3d,id=%s", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - hostdev->info.alias); - } + if (!(devstr = qemuBuildUSBHostdevDevStr(hostdev))) + goto error; + ADD_ARG(devstr); } else { ADD_ARG_LIT("-usbdevice"); - if (hostdev->source.subsys.u.usb.vendor) { - ret = virAsprintf(&usbdev, "host:%.4x:%.4x", - hostdev->source.subsys.u.usb.vendor, - hostdev->source.subsys.u.usb.product); - } else { - ret = virAsprintf(&usbdev, "host:%.3d.%.3d", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device); - } + if (!(devstr = qemuBuildUSBHostdevUsbDevStr(hostdev))) + goto error; + ADD_ARG(devstr); } - if (ret < 0) - goto error; - - ADD_ARG(usbdev); } /* PCI */ @@ -3803,21 +3842,19 @@ int qemudBuildCommandLine(virConnectPtr conn, hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) { ADD_ARG_LIT("-device"); - if (!(pcidev = qemuBuildPCIHostdevDevStr(hostdev))) + if (!(devstr = qemuBuildPCIHostdevDevStr(hostdev))) goto error; + ADD_ARG(devstr); } else if (qemuCmdFlags & QEMUD_CMD_FLAG_PCIDEVICE) { ADD_ARG_LIT("-pcidevice"); - if (virAsprintf(&pcidev, "host=%.2x:%.2x.%.1x", - hostdev->source.subsys.u.pci.bus, - hostdev->source.subsys.u.pci.slot, - hostdev->source.subsys.u.pci.function) < 0) - goto no_memory; + if (!(devstr = qemuBuildPCIHostdevPCIDevStr(hostdev))) + goto error; + ADD_ARG(devstr); } else { qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT, "%s", _("PCI device assignment is not supported by this version of qemu")); goto error; } - ADD_ARG(pcidev); } } diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index b6f128f..c3b196e 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -227,11 +227,21 @@ char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev); char * qemuBuildSoundDevStr(virDomainSoundDefPtr sound); +/* Legacy, pre device support */ +char * qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev); +/* Current, best practice */ char * qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev); +/* Current, best practice */ char * qemuBuildChrChardevStr(virDomainChrDefPtr dev); +/* Legacy, pre device support */ char * qemuBuildChrArgStr(virDomainChrDefPtr dev, const char *prefix); +/* Legacy, pre device support */ +char * qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev); +/* Current, best practice */ +char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev); + int qemudNetworkIfaceConnect (virConnectPtr conn, -- 1.6.5.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list