]> xenbits.xensource.com Git - libvirt.git/commitdiff
hostdev: Mark PCI devices as inactive as they're detached
authorAndrea Bolognani <abologna@redhat.com>
Thu, 17 Dec 2015 10:54:14 +0000 (11:54 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Mon, 21 Dec 2015 10:21:00 +0000 (11:21 +0100)
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.

src/util/virhostdev.c

index f9072a457e38378c0d6513c15a76a8e593db5b25..afacd4e9b9704519bfedff0f96b161a94ccd5ee7 100644 (file)
@@ -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: