Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx> --- src/qemu/qemu_conf.h | 9 +-- src/qemu/qemu_driver.c | 59 ++++++++----------- src/qemu/qemu_hostdev.c | 151 ++++++++++++++++++++++++++---------------------- 3 files changed, 108 insertions(+), 111 deletions(-) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index ece185b..c57fd41 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -44,6 +44,7 @@ # include "locking/lock_manager.h" # include "qemu_capabilities.h" # include "virclosecallbacks.h" +# include "virhostdev.h" # ifdef CPU_SETSIZE /* Linux */ # define QEMUD_CPUMASK_LEN CPU_SETSIZE @@ -215,13 +216,7 @@ struct _virQEMUDriver { /* Immutable pointer. self-locking APIs */ virSecurityManagerPtr securityManager; - /* Immutable pointers. Requires locks to be held before - * calling APIs. activePciHostdevs must be locked before - * inactivePciHostdevs */ - virPCIDeviceListPtr activePciHostdevs; - virPCIDeviceListPtr inactivePciHostdevs; - virUSBDeviceListPtr activeUsbHostdevs; - virSCSIDeviceListPtr activeScsiHostdevs; + virHostdevManagerPtr hostdevMgr; /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr sharedDevices; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f3a1f58..3d25d14 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -95,6 +95,7 @@ #include "viraccessapicheck.h" #include "viraccessapicheckqemu.h" #include "storage/storage_driver.h" +#include "virhostdev.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -695,16 +696,7 @@ qemuStateInitialize(bool privileged, if (qemuSecurityInit(qemu_driver) < 0) goto error; - if ((qemu_driver->activePciHostdevs = virPCIDeviceListNew()) == NULL) - goto error; - - if ((qemu_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL) - goto error; - - if ((qemu_driver->inactivePciHostdevs = virPCIDeviceListNew()) == NULL) - goto error; - - if ((qemu_driver->activeScsiHostdevs = virSCSIDeviceListNew()) == NULL) + if (!(qemu_driver->hostdevMgr = virHostdevManagerGetDefault())) goto error; if (!(qemu_driver->sharedDevices = virHashCreate(30, qemuSharedDeviceEntryFree))) @@ -983,10 +975,7 @@ qemuStateCleanup(void) { virNWFilterUnRegisterCallbackDriver(&qemuCallbackDriver); virObjectUnref(qemu_driver->config); - virObjectUnref(qemu_driver->activePciHostdevs); - virObjectUnref(qemu_driver->inactivePciHostdevs); - virObjectUnref(qemu_driver->activeUsbHostdevs); - virObjectUnref(qemu_driver->activeScsiHostdevs); + virObjectUnref(qemu_driver->hostdevMgr); virHashFree(qemu_driver->sharedDevices); virObjectUnref(qemu_driver->caps); virQEMUCapsCacheFree(qemu_driver->qemuCapsCache); @@ -11290,6 +11279,7 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, char *xml = NULL; bool legacy = qemuHostdevHostSupportsPassthroughLegacy(); bool vfio = qemuHostdevHostSupportsPassthroughVFIO(); + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virCheckFlags(0, -1); @@ -11348,18 +11338,18 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, goto cleanup; } - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); + virObjectLock(hostdev_mgr->activePciHostdevs); + virObjectLock(hostdev_mgr->inactivePciHostdevs); - if (virPCIDeviceDetach(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) { + if (virPCIDeviceDetach(pci, hostdev_mgr->activePciHostdevs, + hostdev_mgr->inactivePciHostdevs) < 0) { goto out; } ret = 0; out: - virObjectUnlock(driver->inactivePciHostdevs); - virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(hostdev_mgr->inactivePciHostdevs); + virObjectUnlock(hostdev_mgr->activePciHostdevs); cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); @@ -11383,6 +11373,7 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) int ret = -1; virNodeDeviceDefPtr def = NULL; char *xml = NULL; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; xml = virNodeDeviceGetXMLDesc(dev, 0); if (!xml) @@ -11402,9 +11393,9 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) if (!pci) goto cleanup; - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); - other = virPCIDeviceListFind(driver->activePciHostdevs, pci); + virObjectLock(hostdev_mgr->activePciHostdevs); + virObjectLock(hostdev_mgr->inactivePciHostdevs); + other = virPCIDeviceListFind(hostdev_mgr->activePciHostdevs, pci); if (other) { const char *other_drvname = NULL; const char *other_domname = NULL; @@ -11425,14 +11416,14 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) virPCIDeviceReattachInit(pci); - if (virPCIDeviceReattach(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) + if (virPCIDeviceReattach(pci, hostdev_mgr->activePciHostdevs, + hostdev_mgr->inactivePciHostdevs) < 0) goto out; ret = 0; out: - virObjectUnlock(driver->inactivePciHostdevs); - virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(hostdev_mgr->inactivePciHostdevs); + virObjectUnlock(hostdev_mgr->activePciHostdevs); virPCIDeviceFree(pci); cleanup: virNodeDeviceDefFree(def); @@ -11449,6 +11440,7 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) int ret = -1; virNodeDeviceDefPtr def = NULL; char *xml = NULL; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; xml = virNodeDeviceGetXMLDesc(dev, 0); if (!xml) @@ -11468,17 +11460,16 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) if (!pci) goto cleanup; - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); - - if (virPCIDeviceReset(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) + virObjectLock(hostdev_mgr->activePciHostdevs); + virObjectLock(hostdev_mgr->inactivePciHostdevs); + if (virPCIDeviceReset(pci, hostdev_mgr->activePciHostdevs, + hostdev_mgr->inactivePciHostdevs) < 0) goto out; ret = 0; out: - virObjectUnlock(driver->inactivePciHostdevs); - virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(hostdev_mgr->inactivePciHostdevs); + virObjectUnlock(hostdev_mgr->activePciHostdevs); virPCIDeviceFree(pci); cleanup: virNodeDeviceDefFree(def); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 0814263..a4ee611 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -37,6 +37,7 @@ #include "virscsi.h" #include "virnetdev.h" #include "virfile.h" +#include "virhostdev.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -99,10 +100,10 @@ qemuGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) * * Return the new list, or NULL if there was a failure. * - * Pre-condition: driver->activePciHostdevs is locked + * Pre-condition: activePciHostdevs is locked */ static virPCIDeviceListPtr -qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver, +qemuGetActivePciHostDeviceList(virHostdevManagerPtr mgr, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { @@ -123,7 +124,7 @@ qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver, continue; addr = &hostdev->source.subsys.u.pci.addr; - activeDev = virPCIDeviceListFindByIDs(driver->activePciHostdevs, + activeDev = virPCIDeviceListFindByIDs(mgr->activePciHostdevs, addr->domain, addr->bus, addr->slot, addr->function); if (activeDev && virPCIDeviceListAddCopy(list, activeDev) < 0) { @@ -144,12 +145,13 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, virPCIDevicePtr dev = NULL; size_t i; int ret = -1; + virHostdevManagerPtr mgr = driver->hostdevMgr; if (!def->nhostdevs) return 0; - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); + virObjectLock(mgr->activePciHostdevs); + virObjectLock(mgr->inactivePciHostdevs); for (i = 0; i < def->nhostdevs; i++) { hostdev = def->hostdevs[i]; @@ -184,7 +186,7 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot); virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe); - if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) + if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0) goto cleanup; dev = NULL; } @@ -192,12 +194,11 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, ret = 0; cleanup: virPCIDeviceFree(dev); - virObjectUnlock(driver->activePciHostdevs); - virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(mgr->activePciHostdevs); + virObjectUnlock(mgr->inactivePciHostdevs); return ret; } - int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def) @@ -205,11 +206,12 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev = NULL; size_t i; int ret = -1; + virHostdevManagerPtr mgr = driver->hostdevMgr; if (!def->nhostdevs) return 0; - virObjectLock(driver->activeUsbHostdevs); + virObjectLock(mgr->activeUsbHostdevs); for (i = 0; i < def->nhostdevs; i++) { virUSBDevicePtr usb = NULL; hostdev = def->hostdevs[i]; @@ -232,14 +234,14 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, virUSBDeviceSetUsedBy(usb, QEMU_DRIVER_NAME, def->name); - if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { + if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) { virUSBDeviceFree(usb); goto cleanup; } } ret = 0; cleanup: - virObjectUnlock(driver->activeUsbHostdevs); + virObjectUnlock(mgr->activeUsbHostdevs); return ret; } @@ -252,11 +254,12 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, int ret = -1; virSCSIDevicePtr scsi = NULL; virSCSIDevicePtr tmp = NULL; + virHostdevManagerPtr mgr = driver->hostdevMgr; if (!def->nhostdevs) return 0; - virObjectLock(driver->activeScsiHostdevs); + virObjectLock(mgr->activeScsiHostdevs); for (i = 0; i < def->nhostdevs; i++) { hostdev = def->hostdevs[i]; @@ -273,7 +276,7 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, hostdev->shareable))) goto cleanup; - if ((tmp = virSCSIDeviceListFind(driver->activeScsiHostdevs, scsi))) { + if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) { if (virSCSIDeviceSetUsedBy(tmp, QEMU_DRIVER_NAME, def->name) < 0) { virSCSIDeviceFree(scsi); goto cleanup; @@ -281,7 +284,7 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, virSCSIDeviceFree(scsi); } else { if (virSCSIDeviceSetUsedBy(scsi, QEMU_DRIVER_NAME, def->name) < 0 || - virSCSIDeviceListAdd(driver->activeScsiHostdevs, scsi) < 0) { + virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) { virSCSIDeviceFree(scsi); goto cleanup; } @@ -290,7 +293,7 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, ret = 0; cleanup: - virObjectUnlock(driver->activeScsiHostdevs); + virObjectUnlock(mgr->activeScsiHostdevs); return ret; } @@ -657,12 +660,13 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, size_t i; int ret = -1; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps)) - goto cleanup; + goto out; - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); + virObjectLock(hostdev_mgr->activePciHostdevs); + virObjectLock(hostdev_mgr->inactivePciHostdevs); if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs))) goto cleanup; @@ -690,9 +694,9 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, goto cleanup; } /* The device is in use by other active domain if - * the dev is in list driver->activePciHostdevs. + * the dev is in list activePciHostdevs. */ - if ((other = virPCIDeviceListFind(driver->activePciHostdevs, dev))) { + if ((other = virPCIDeviceListFind(hostdev_mgr->activePciHostdevs, dev))) { const char *other_drvname; const char *other_domname; @@ -715,7 +719,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); if (virPCIDeviceGetManaged(dev) && - virPCIDeviceDetach(dev, driver->activePciHostdevs, NULL) < 0) + virPCIDeviceDetach(dev, hostdev_mgr->activePciHostdevs, NULL) < 0) goto reattachdevs; } @@ -724,8 +728,8 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); - if (virPCIDeviceReset(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) + if (virPCIDeviceReset(dev, hostdev_mgr->activePciHostdevs, + hostdev_mgr->inactivePciHostdevs) < 0) goto reattachdevs; } @@ -750,24 +754,24 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, /* Loop 5: Now mark all the devices as active */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); - if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) + if (virPCIDeviceListAdd(hostdev_mgr->activePciHostdevs, dev) < 0) goto inactivedevs; } /* Loop 6: Now remove the devices from inactive list. */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); - virPCIDeviceListDel(driver->inactivePciHostdevs, dev); + virPCIDeviceListDel(hostdev_mgr->inactivePciHostdevs, dev); } /* Loop 7: Now set the used_by_domain of the device in - * driver->activePciHostdevs as domain name. + * activePciHostdevs as domain name. */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev, activeDev; dev = virPCIDeviceListGet(pcidevs, i); - activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev); + activeDev = virPCIDeviceListFind(hostdev_mgr->activePciHostdevs, dev); if (activeDev) virPCIDeviceSetUsedBy(activeDev, QEMU_DRIVER_NAME, name); @@ -813,12 +817,12 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, goto cleanup; inactivedevs: - /* Only steal all the devices from driver->activePciHostdevs. We will + /* Only steal all the devices from activePciHostdevs. We will * free them in virObjectUnref(). */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); - virPCIDeviceListSteal(driver->activePciHostdevs, dev); + virPCIDeviceListSteal(hostdev_mgr->activePciHostdevs, dev); } resetvfnetconfig: @@ -833,21 +837,22 @@ reattachdevs: /* NB: This doesn't actually re-bind to original driver, just * unbinds from the stub driver */ - ignore_value(virPCIDeviceReattach(dev, driver->activePciHostdevs, + ignore_value(virPCIDeviceReattach(dev, hostdev_mgr->activePciHostdevs, NULL)); } cleanup: - virObjectUnlock(driver->activePciHostdevs); - virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(hostdev_mgr->activePciHostdevs); + virObjectUnlock(hostdev_mgr->inactivePciHostdevs); virObjectUnref(pcidevs); +out: virObjectUnref(cfg); return ret; } static int -qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, +qemuPrepareHostdevUSBDevices(virHostdevManagerPtr mgr, const char *name, virUSBDeviceListPtr list) { @@ -855,12 +860,12 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, unsigned int count; virUSBDevicePtr tmp; - virObjectLock(driver->activeUsbHostdevs); + virObjectLock(mgr->activeUsbHostdevs); count = virUSBDeviceListCount(list); for (i = 0; i < count; i++) { virUSBDevicePtr usb = virUSBDeviceListGet(list, i); - if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) { + if ((tmp = virUSBDeviceListFind(mgr->activeUsbHostdevs, usb))) { const char *other_drvname; const char *other_domname; @@ -886,19 +891,19 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, * from the virUSBDeviceList that passed in on success, * perform rollback on failure. */ - if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) + if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) goto error; } - virObjectUnlock(driver->activeUsbHostdevs); + virObjectUnlock(mgr->activeUsbHostdevs); return 0; error: for (j = 0; j < i; j++) { tmp = virUSBDeviceListGet(list, i); - virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp); + virUSBDeviceListSteal(mgr->activeUsbHostdevs, tmp); } - virObjectUnlock(driver->activeUsbHostdevs); + virObjectUnlock(mgr->activeUsbHostdevs); return -1; } @@ -1002,6 +1007,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, int ret = -1; virUSBDeviceListPtr list; virUSBDevicePtr tmp; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; /* To prevent situation where USB device is assigned to two domains * we need to keep a list of currently assigned USB devices. @@ -1041,7 +1047,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, * and add them do driver list. However, if something goes * wrong, perform rollback. */ - if (qemuPrepareHostdevUSBDevices(driver, name, list) < 0) + if (qemuPrepareHostdevUSBDevices(hostdev_mgr, name, list) < 0) goto cleanup; /* Loop 2: Temporary list was successfully merged with @@ -1071,6 +1077,7 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, int count; virSCSIDeviceListPtr list; virSCSIDevicePtr tmp; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; /* Loop 1: Add the shared scsi host device to shared device * table. @@ -1130,12 +1137,13 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, * and add them to driver list. However, if something goes * wrong, perform rollback. */ - virObjectLock(driver->activeScsiHostdevs); + virObjectLock(hostdev_mgr->activeScsiHostdevs); count = virSCSIDeviceListCount(list); for (i = 0; i < count; i++) { virSCSIDevicePtr scsi = virSCSIDeviceListGet(list, i); - if ((tmp = virSCSIDeviceListFind(driver->activeScsiHostdevs, scsi))) { + if ((tmp = virSCSIDeviceListFind(hostdev_mgr->activeScsiHostdevs, + scsi))) { bool scsi_shareable = virSCSIDeviceGetShareable(scsi); bool tmp_shareable = virSCSIDeviceGetShareable(tmp); @@ -1156,12 +1164,12 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, VIR_DEBUG("Adding %s to activeScsiHostdevs", virSCSIDeviceGetName(scsi)); - if (virSCSIDeviceListAdd(driver->activeScsiHostdevs, scsi) < 0) + if (virSCSIDeviceListAdd(hostdev_mgr->activeScsiHostdevs, scsi) < 0) goto error; } } - virObjectUnlock(driver->activeScsiHostdevs); + virObjectUnlock(hostdev_mgr->activeScsiHostdevs); /* Loop 4: Temporary list was successfully merged with * driver list, so steal all items to avoid freeing them @@ -1178,9 +1186,9 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver, error: for (j = 0; j < i; j++) { tmp = virSCSIDeviceListGet(list, i); - virSCSIDeviceListSteal(driver->activeScsiHostdevs, tmp); + virSCSIDeviceListSteal(hostdev_mgr->activeScsiHostdevs, tmp); } - virObjectUnlock(driver->activeScsiHostdevs); + virObjectUnlock(hostdev_mgr->activeScsiHostdevs); cleanup: virObjectUnref(list); return -1; @@ -1214,11 +1222,11 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver, /* - * Pre-condition: driver->inactivePciHostdevs & driver->activePciHostdevs + * Pre-condition: inactivePciHostdevs & activePciHostdevs * are locked */ static void -qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) +qemuReattachPciDevice(virPCIDevicePtr dev, virHostdevManagerPtr mgr) { int retries = 100; @@ -1226,7 +1234,7 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) * successfully, it must have been inactive. */ if (!virPCIDeviceGetManaged(dev)) { - if (virPCIDeviceListAdd(driver->inactivePciHostdevs, dev) < 0) + if (virPCIDeviceListAdd(mgr->inactivePciHostdevs, dev) < 0) virPCIDeviceFree(dev); return; } @@ -1237,8 +1245,8 @@ qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) retries--; } - if (virPCIDeviceReattach(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) { + if (virPCIDeviceReattach(dev, mgr->activePciHostdevs, + mgr->inactivePciHostdevs) < 0) { virErrorPtr err = virGetLastError(); VIR_ERROR(_("Failed to re-attach PCI device: %s"), err ? err->message : _("unknown error")); @@ -1257,11 +1265,12 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, virPCIDeviceListPtr pcidevs; size_t i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; - virObjectLock(driver->activePciHostdevs); - virObjectLock(driver->inactivePciHostdevs); + virObjectLock(hostdev_mgr->activePciHostdevs); + virObjectLock(hostdev_mgr->inactivePciHostdevs); - if (!(pcidevs = qemuGetActivePciHostDeviceList(driver, + if (!(pcidevs = qemuGetActivePciHostDeviceList(hostdev_mgr, hostdevs, nhostdevs))) { virErrorPtr err = virGetLastError(); @@ -1283,7 +1292,7 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, * other domain. Or delete it from activePciHostDevs if it had * been used by this domain. */ - activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev); + activeDev = virPCIDeviceListFind(hostdev_mgr->activePciHostdevs, dev); if (activeDev) { const char *usedby_drvname; const char *usedby_domname; @@ -1295,7 +1304,7 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, } } - virPCIDeviceListDel(driver->activePciHostdevs, dev); + virPCIDeviceListDel(hostdev_mgr->activePciHostdevs, dev); } /* At this point, any device that had been used by the guest is in @@ -1312,8 +1321,8 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); - if (virPCIDeviceReset(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) { + if (virPCIDeviceReset(dev, hostdev_mgr->activePciHostdevs, + hostdev_mgr->inactivePciHostdevs) < 0) { virErrorPtr err = virGetLastError(); VIR_ERROR(_("Failed to reset PCI device: %s"), err ? err->message : _("unknown error")); @@ -1323,13 +1332,13 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, while (virPCIDeviceListCount(pcidevs) > 0) { virPCIDevicePtr dev = virPCIDeviceListStealIndex(pcidevs, 0); - qemuReattachPciDevice(dev, driver); + qemuReattachPciDevice(dev, hostdev_mgr); } virObjectUnref(pcidevs); cleanup: - virObjectUnlock(driver->activePciHostdevs); - virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(hostdev_mgr->activePciHostdevs); + virObjectUnlock(hostdev_mgr->inactivePciHostdevs); virObjectUnref(cfg); } @@ -1341,8 +1350,9 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, int nhostdevs) { size_t i; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; - virObjectLock(driver->activeUsbHostdevs); + virObjectLock(hostdev_mgr->activeUsbHostdevs); for (i = 0; i < nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virUSBDevicePtr usb, tmp; @@ -1374,7 +1384,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, * Therefore we want to steal only those devices from * the list which were taken by @name */ - tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb); + tmp = virUSBDeviceListFind(hostdev_mgr->activeUsbHostdevs, usb); virUSBDeviceFree(usb); if (!tmp) { @@ -1393,10 +1403,10 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, hostdev->source.subsys.u.usb.device, name); - virUSBDeviceListDel(driver->activeUsbHostdevs, tmp); + virUSBDeviceListDel(hostdev_mgr->activeUsbHostdevs, tmp); } } - virObjectUnlock(driver->activeUsbHostdevs); + virObjectUnlock(hostdev_mgr->activeUsbHostdevs); } @@ -1407,8 +1417,9 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, int nhostdevs) { size_t i; + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; - virObjectLock(driver->activeScsiHostdevs); + virObjectLock(hostdev_mgr->activeScsiHostdevs); for (i = 0; i < nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virSCSIDevicePtr scsi; @@ -1443,7 +1454,7 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, /* Only delete the devices which are marked as being used by @name, * because qemuProcessStart could fail on the half way. */ - if (!(tmp = virSCSIDeviceListFind(driver->activeScsiHostdevs, scsi))) { + if (!(tmp = virSCSIDeviceListFind(hostdev_mgr->activeScsiHostdevs, scsi))) { VIR_WARN("Unable to find device %s:%d:%d:%d " "in list of active SCSI devices", hostdev->source.subsys.u.scsi.adapter, @@ -1461,10 +1472,10 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver, hostdev->source.subsys.u.scsi.unit, name); - virSCSIDeviceListDel(driver->activeScsiHostdevs, tmp, QEMU_DRIVER_NAME, name); + virSCSIDeviceListDel(hostdev_mgr->activeScsiHostdevs, tmp, QEMU_DRIVER_NAME, name); virSCSIDeviceFree(scsi); } - virObjectUnlock(driver->activeScsiHostdevs); + virObjectUnlock(hostdev_mgr->activeScsiHostdevs); } void -- 1.9.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list