return -1;
qemuDriverLock(driver);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
in_inactive_list = virPCIDeviceListFind(driver->inactivePciHostdevs, pci);
if (virPCIDeviceDetach(pci, driver->activePciHostdevs,
ret = 0;
out:
+ virObjectUnlock(driver->inactivePciHostdevs);
+ virObjectUnlock(driver->activePciHostdevs);
qemuDriverUnlock(driver);
if (in_inactive_list)
virPCIDeviceFree(pci);
if (!pci)
return -1;
+ qemuDriverLock(driver);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
other = virPCIDeviceListFind(driver->activePciHostdevs, pci);
if (other) {
const char *other_name = virPCIDeviceGetUsedBy(other);
virReportError(VIR_ERR_OPERATION_INVALID,
_("PCI device %s is still in use"),
virPCIDeviceGetName(pci));
+ goto out;
}
virPCIDeviceReattachInit(pci);
- qemuDriverLock(driver);
if (virPCIDeviceReattach(pci, driver->activePciHostdevs,
driver->inactivePciHostdevs, "pci-stub") < 0)
goto out;
ret = 0;
out:
+ virObjectUnlock(driver->inactivePciHostdevs);
+ virObjectUnlock(driver->activePciHostdevs);
qemuDriverUnlock(driver);
virPCIDeviceFree(pci);
return ret;
return -1;
qemuDriverLock(driver);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
if (virPCIDeviceReset(pci, driver->activePciHostdevs,
driver->inactivePciHostdevs) < 0)
ret = 0;
out:
+ virObjectUnlock(driver->inactivePciHostdevs);
+ virObjectUnlock(driver->activePciHostdevs);
qemuDriverUnlock(driver);
virPCIDeviceFree(pci);
return ret;
return list;
}
+/*
+ * Pre-condition: driver->activePciHostdevs is locked
+ */
static virPCIDeviceListPtr
qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver,
virDomainHostdevDefPtr *hostdevs,
{
virDomainHostdevDefPtr hostdev = NULL;
int i;
+ int ret = -1;
if (!def->nhostdevs)
return 0;
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
+
for (i = 0; i < def->nhostdevs; i++) {
virPCIDevicePtr dev = NULL;
hostdev = def->hostdevs[i];
hostdev->source.subsys.u.pci.function);
if (!dev)
- return -1;
+ goto cleanup;
virPCIDeviceSetManaged(dev, hostdev->managed);
virPCIDeviceSetUsedBy(dev, def->name);
if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) {
virPCIDeviceFree(dev);
- return -1;
+ goto cleanup;
}
}
- return 0;
+cleanup:
+ virObjectUnlock(driver->activePciHostdevs);
+ virObjectUnlock(driver->inactivePciHostdevs);
+ return ret;
}
int
{
virDomainHostdevDefPtr hostdev = NULL;
int i;
+ int ret = -1;
if (!def->nhostdevs)
return 0;
+ virObjectLock(driver->activeUsbHostdevs);
for (i = 0; i < def->nhostdevs; i++) {
virUSBDevicePtr usb = NULL;
hostdev = def->hostdevs[i];
if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) {
virUSBDeviceFree(usb);
- return -1;
+ goto cleanup;
}
}
-
- return 0;
+ ret = 0;
+cleanup:
+ virObjectUnlock(driver->activeUsbHostdevs);
+ return ret;
}
static int
int ret = -1;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
+
if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs)))
goto cleanup;
}
cleanup:
+ virObjectUnlock(driver->activePciHostdevs);
+ virObjectUnlock(driver->inactivePciHostdevs);
virObjectUnref(pcidevs);
virObjectUnref(cfg);
return ret;
}
-static int
-qemuPrepareHostPCIDevices(virQEMUDriverPtr driver,
- virDomainDefPtr def)
-{
- return qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
- def->hostdevs, def->nhostdevs);
-}
-
int
qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver,
const char *name,
unsigned int count;
virUSBDevicePtr tmp;
+ virObjectLock(driver->activeUsbHostdevs);
count = virUSBDeviceListCount(list);
for (i = 0; i < count; i++) {
if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0)
goto error;
}
+
+ virObjectUnlock(driver->activeUsbHostdevs);
return 0;
error:
tmp = virUSBDeviceListGet(list, i);
virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp);
}
+ virObjectUnlock(driver->activeUsbHostdevs);
return -1;
}
if (!def->nhostdevs)
return 0;
- if (qemuPrepareHostPCIDevices(driver, def) < 0)
+ if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
+ def->hostdevs, def->nhostdevs) < 0)
return -1;
if (qemuPrepareHostUSBDevices(driver, def, coldBoot) < 0)
}
+/*
+ * Pre-condition: driver->inactivePciHostdevs & driver->activePciHostdevs
+ * are locked
+ */
void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver)
{
int retries = 100;
int i;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
+
if (!(pcidevs = qemuGetActivePciHostDeviceList(driver,
hostdevs,
nhostdevs))) {
virObjectUnref(pcidevs);
cleanup:
+ virObjectUnlock(driver->activePciHostdevs);
+ virObjectUnlock(driver->inactivePciHostdevs);
virObjectUnref(cfg);
}
{
int i;
+ virObjectLock(driver->activeUsbHostdevs);
for (i = 0; i < nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = hostdevs[i];
virUSBDevicePtr usb, tmp;
virUSBDeviceListDel(driver->activeUsbHostdevs, tmp);
}
}
+ virObjectUnlock(driver->activeUsbHostdevs);
}
void qemuDomainReAttachHostDevices(virQEMUDriverPtr driver,
if (detach->parent.data.net)
qemuDomainHostdevNetConfigRestore(detach, cfg->stateDir);
+ virObjectLock(driver->activePciHostdevs);
+ virObjectLock(driver->inactivePciHostdevs);
pci = virPCIDeviceNew(subsys->u.pci.domain, subsys->u.pci.bus,
subsys->u.pci.slot, subsys->u.pci.function);
if (pci) {
}
virPCIDeviceFree(pci);
}
+ virObjectUnlock(driver->activePciHostdevs);
+ virObjectUnlock(driver->inactivePciHostdevs);
if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) &&
qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
usb = virUSBDeviceNew(subsys->u.usb.bus, subsys->u.usb.device, NULL);
if (usb) {
+ virObjectLock(driver->activeUsbHostdevs);
virUSBDeviceListDel(driver->activeUsbHostdevs, usb);
+ virObjectUnlock(driver->activeUsbHostdevs);
virUSBDeviceFree(usb);
} else {
VIR_WARN("Unable to find device %03d.%03d in list of used USB devices",