diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index db1becce492b8594bcaf36394c2cfff3dd4946d6..0b6f84e6a64b1c445ea2cc782bd83520f9db3817 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1301,6 +1301,9 @@ virHookPresent; virHostdevManagerGetDefault; virHostdevPreparePCIDevices; virHostdevReAttachPCIDevices; +virHostdevUpdateActivePciHostdevs; +virHostdevUpdateActiveScsiHostdevs; +virHostdevUpdateActiveUsbHostdevs; # util/viridentity.h virIdentityGetAttr; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ee3a18de5edcf208d11c10aa08b81618fca7ad3f..bb3dc69af1714ab7053f046f668da7cb1378da10 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -41,65 +41,6 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -static int -virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - virDomainDefPtr def) -{ - virDomainHostdevDefPtr hostdev = NULL; - virPCIDevicePtr dev = NULL; - size_t i; - int ret = -1; - - virObjectLock(mgr->activePciHostdevs); - virObjectLock(mgr->inactivePciHostdevs); - - for (i = 0; i < def->nhostdevs; i++) { - hostdev = def->hostdevs[i]; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) - continue; - - dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain, - hostdev->source.subsys.u.pci.addr.bus, - hostdev->source.subsys.u.pci.addr.slot, - hostdev->source.subsys.u.pci.addr.function); - - if (!dev) - goto cleanup; - - virPCIDeviceSetManaged(dev, hostdev->managed); - if (hostdev->source.subsys.u.pci.backend - == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { - if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0) - goto cleanup; - } else { - if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0) - goto cleanup; - - } - virPCIDeviceSetUsedBy(dev, drv_name, def->name); - - /* Setup the original states for the PCI device */ - virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub); - virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot); - virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe); - - if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0) - goto cleanup; - dev = NULL; - } - - ret = 0; -cleanup: - virPCIDeviceFree(dev); - virObjectUnlock(mgr->activePciHostdevs); - virObjectUnlock(mgr->inactivePciHostdevs); - return ret; -} - int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def) @@ -112,49 +53,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def); } -static int -virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - virDomainDefPtr def) -{ - virDomainHostdevDefPtr hostdev = NULL; - size_t i; - int ret = -1; - - virObjectLock(mgr->activeUsbHostdevs); - for (i = 0; i < def->nhostdevs; i++) { - virUSBDevicePtr usb = NULL; - hostdev = def->hostdevs[i]; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) - continue; - - usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); - if (!usb) { - VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - def->name); - continue; - } - - virUSBDeviceSetUsedBy(usb, drv_name, def->name); - - if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) { - virUSBDeviceFree(usb); - goto cleanup; - } - } - ret = 0; -cleanup: - virObjectUnlock(mgr->activeUsbHostdevs); - return ret; -} - int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def) @@ -167,55 +65,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def); } -static int -virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, - const char *drv_name, - virDomainDefPtr def) -{ - virDomainHostdevDefPtr hostdev = NULL; - size_t i; - int ret = -1; - virSCSIDevicePtr scsi = NULL; - virSCSIDevicePtr tmp = NULL; - - virObjectLock(mgr->activeScsiHostdevs); - for (i = 0; i < def->nhostdevs; i++) { - hostdev = def->hostdevs[i]; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || - hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) - continue; - - if (!(scsi = virSCSIDeviceNew(NULL, - hostdev->source.subsys.u.scsi.adapter, - hostdev->source.subsys.u.scsi.bus, - hostdev->source.subsys.u.scsi.target, - hostdev->source.subsys.u.scsi.unit, - hostdev->readonly, - hostdev->shareable))) - goto cleanup; - - if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) { - if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) { - virSCSIDeviceFree(scsi); - goto cleanup; - } - virSCSIDeviceFree(scsi); - } else { - if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 || - virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) { - virSCSIDeviceFree(scsi); - goto cleanup; - } - } - } - ret = 0; - -cleanup: - virObjectUnlock(mgr->activeScsiHostdevs); - return ret; -} - int qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def) diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index a8e3f4681bc9e87dec2a196fede060ad7050590e..f66632ba9f93fcce0f3be1e6b4a555de6e151ad5 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -773,3 +773,154 @@ cleanup: virObjectUnlock(hostdev_mgr->activePciHostdevs); virObjectUnlock(hostdev_mgr->inactivePciHostdevs); } + +int +virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def) +{ + virDomainHostdevDefPtr hostdev = NULL; + virPCIDevicePtr dev = NULL; + size_t i; + int ret = -1; + + virObjectLock(mgr->activePciHostdevs); + virObjectLock(mgr->inactivePciHostdevs); + + for (i = 0; i < def->nhostdevs; i++) { + hostdev = def->hostdevs[i]; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + continue; + if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) + continue; + + dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain, + hostdev->source.subsys.u.pci.addr.bus, + hostdev->source.subsys.u.pci.addr.slot, + hostdev->source.subsys.u.pci.addr.function); + + if (!dev) + goto cleanup; + + virPCIDeviceSetManaged(dev, hostdev->managed); + if (hostdev->source.subsys.u.pci.backend + == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { + if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0) + goto cleanup; + } else { + if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0) + goto cleanup; + + } + virPCIDeviceSetUsedBy(dev, drv_name, def->name); + + /* Setup the original states for the PCI device */ + virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub); + virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot); + virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe); + + if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0) + goto cleanup; + dev = NULL; + } + + ret = 0; +cleanup: + virPCIDeviceFree(dev); + virObjectUnlock(mgr->activePciHostdevs); + virObjectUnlock(mgr->inactivePciHostdevs); + return ret; +} + +int +virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def) +{ + virDomainHostdevDefPtr hostdev = NULL; + size_t i; + int ret = -1; + + virObjectLock(mgr->activeUsbHostdevs); + for (i = 0; i < def->nhostdevs; i++) { + virUSBDevicePtr usb = NULL; + hostdev = def->hostdevs[i]; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + continue; + if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) + continue; + + usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL); + if (!usb) { + VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", + hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + def->name); + continue; + } + + virUSBDeviceSetUsedBy(usb, drv_name, def->name); + + if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) { + virUSBDeviceFree(usb); + goto cleanup; + } + } + ret = 0; +cleanup: + virObjectUnlock(mgr->activeUsbHostdevs); + return ret; +} + +int +virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def) +{ + virDomainHostdevDefPtr hostdev = NULL; + size_t i; + int ret = -1; + virSCSIDevicePtr scsi = NULL; + virSCSIDevicePtr tmp = NULL; + + virObjectLock(mgr->activeScsiHostdevs); + for (i = 0; i < def->nhostdevs; i++) { + hostdev = def->hostdevs[i]; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) + continue; + + if (!(scsi = virSCSIDeviceNew(NULL, + hostdev->source.subsys.u.scsi.adapter, + hostdev->source.subsys.u.scsi.bus, + hostdev->source.subsys.u.scsi.target, + hostdev->source.subsys.u.scsi.unit, + hostdev->readonly, + hostdev->shareable))) + goto cleanup; + + if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) { + if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) { + virSCSIDeviceFree(scsi); + goto cleanup; + } + virSCSIDeviceFree(scsi); + } else { + if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 || + virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) { + virSCSIDeviceFree(scsi); + goto cleanup; + } + } + } + ret = 0; + +cleanup: + virObjectUnlock(mgr->activeScsiHostdevs); + return ret; +} diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h index c8b17e6f778c3c5e4eff27f847023735acd4a4f7..e6b5e31fd892044b72389c709e73c5f2ae46fe1a 100644 --- a/src/util/virhostdev.h +++ b/src/util/virhostdev.h @@ -65,5 +65,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, virDomainHostdevDefPtr *hostdevs, int nhostdevs, char *oldStateDir); +int +virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def); +int +virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def); +int +virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr, + const char *drv_name, + virDomainDefPtr def); #endif /* __VIR_HOSTDEV_H__ */