diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 7247b73cf2..162e1c2ff8 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -926,33 +926,6 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr, return ret; } -/* - * Pre-condition: inactivePCIHostdevs & activePCIHostdevs - * are locked - */ -static void -virHostdevReattachPCIDevice(virHostdevManagerPtr mgr, - virPCIDevicePtr actual) -{ - /* Wait for device cleanup if it is qemu/kvm */ - if (virPCIDeviceGetStubDriver(actual) == VIR_PCI_STUB_DRIVER_KVM) { - int retries = 100; - while (virPCIDeviceWaitForCleanup(actual, "kvm_assigned_device") - && retries) { - usleep(100*1000); - retries--; - } - } - - VIR_DEBUG("Reattaching PCI device %s", virPCIDeviceGetName(actual)); - if (virPCIDeviceReattach(actual, mgr->activePCIHostdevs, - mgr->inactivePCIHostdevs) < 0) { - VIR_ERROR(_("Failed to re-attach PCI device: %s"), - virGetLastErrorMessage()); - virResetLastError(); - } -} - /* @oldStateDir: * For upgrade purpose: see virHostdevRestoreNetConfig */ @@ -1071,12 +1044,19 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr mgr, virPCIDevicePtr actual; /* We need to look up the actual device because that's what - * virHostdevReattachPCIDevice() expects as its argument */ + * virPCIDeviceReattach() expects as its argument */ if (!(actual = virPCIDeviceListFind(mgr->inactivePCIHostdevs, pci))) continue; - if (virPCIDeviceGetManaged(actual)) - virHostdevReattachPCIDevice(mgr, actual); + if (virPCIDeviceGetManaged(actual)) { + if (virPCIDeviceReattach(actual, + mgr->activePCIHostdevs, + mgr->inactivePCIHostdevs) < 0) { + VIR_ERROR(_("Failed to re-attach PCI device: %s"), + virGetLastErrorMessage()); + virResetLastError(); + } + } else VIR_DEBUG("Not reattaching unmanaged PCI device %s", virPCIDeviceGetName(actual)); diff --git a/src/util/virpci.c b/src/util/virpci.c index bc7ff46194..8deaeb639b 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -1508,6 +1508,10 @@ virPCIDeviceDetach(virPCIDevicePtr dev, return 0; } +/* + * Pre-condition: inactivePCIHostdevs & activePCIHostdevs + * are locked + */ int virPCIDeviceReattach(virPCIDevicePtr dev, virPCIDeviceListPtr activeDevs, @@ -1519,6 +1523,16 @@ virPCIDeviceReattach(virPCIDevicePtr dev, return -1; } + /* Wait for device cleanup if it is qemu/kvm */ + if (virPCIDeviceGetStubDriver(dev) == VIR_PCI_STUB_DRIVER_KVM) { + int retries = 100; + while (virPCIDeviceWaitForCleanup(dev, "kvm_assigned_device") + && retries) { + usleep(100*1000); + retries--; + } + } + if (virPCIDeviceUnbindFromStub(dev) < 0) return -1;