Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
src/libvirt_private.syms | 3 +
src/qemu/qemu_hostdev.c | 152 ----------------------------------------------
src/util/virhostdev.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++
src/util/virhostdev.h | 12 ++++
4 files changed, 167 insertions(+), 152 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 410133a..4417fdd 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1295,6 +1295,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 c35a5df..5771f41 100644
--- a/src/qemu/qemu_hostdev.c
+++ b/src/qemu/qemu_hostdev.c
@@ -41,66 +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 ATTRIBUTE_UNUSED,
virDomainDefPtr def)
@@ -116,49 +56,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
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 ATTRIBUTE_UNUSED,
virDomainDefPtr def)
@@ -174,55 +71,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
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 ATTRIBUTE_UNUSED,
virDomainDefPtr def)
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index c381907..5e7318f 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -750,3 +750,155 @@ cleanup:
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 d3ac1d3..9773c6e 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__ */
--
1.6.0.2