From: Andrea Bolognani Date: Thu, 17 Dec 2015 10:54:14 +0000 (+0100) Subject: hostdev: Mark PCI devices as inactive as they're detached X-Git-Tag: v1.3.1-rc1~128 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8a625f3847c72799ff1558c246de30c76f6956a;p=thirdparty%2Flibvirt.git hostdev: Mark PCI devices as inactive as they're detached We want to eventually factor out the code dealing with device detaching and reattaching, so that we can share it and make sure it's called eg. when 'virsh nodedev-detach' is used. For that to happen, it's important that the lists of active and inactive PCI devices are updated every time a device changes its state. Instead of passing NULL as the last argument of virPCIDeviceDetach() and virPCIDeviceReattach(), pass the proper list so that it can be updated. --- diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index f9072a457e..afacd4e9b9 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -595,11 +595,17 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, /* Loop 2: detach managed devices (i.e. bind to appropriate stub driver) */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + if (virPCIDeviceGetManaged(dev) && - virPCIDeviceDetach(dev, hostdev_mgr->activePCIHostdevs, NULL) < 0) - goto reattachdevs; + virPCIDeviceDetach(dev, + hostdev_mgr->activePCIHostdevs, + hostdev_mgr->inactivePCIHostdevs) < 0) + goto reattachdevs; } + /* At this point, all devices are attached to the stub driver and have + * been marked as inactive */ + /* Loop 3: Now that all the PCI hostdevs have been detached, we * can safely reset them */ for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { @@ -708,8 +714,9 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr hostdev_mgr, /* NB: This doesn't actually re-bind to original driver, just * unbinds from the stub driver */ - ignore_value(virPCIDeviceReattach(dev, hostdev_mgr->activePCIHostdevs, - NULL)); + ignore_value(virPCIDeviceReattach(dev, + hostdev_mgr->activePCIHostdevs, + hostdev_mgr->inactivePCIHostdevs)); } cleanup: