[libvirt] [PATCH v2 2/4] hostdev: Save netdev configuration of actual device

Andrea Bolognani abologna at redhat.com
Fri Mar 18 17:03:51 UTC 2016


We would be just fine looking up the information in pcidevs most
of the time; however, some corner cases would not be handled
properly, so look up the actual device instead.
---
 src/util/virhostdev.c | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index e8efc53..b21aa22 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -689,7 +689,7 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
 
     /* Step 7: Now set the original states for hostdev def */
     for (i = 0; i < nhostdevs; i++) {
-        virPCIDevicePtr pci;
+        virPCIDevicePtr actual;
         virDomainHostdevDefPtr hostdev = hostdevs[i];
         virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
 
@@ -698,24 +698,27 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
         if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
             continue;
 
-        pci = virPCIDeviceListFindByIDs(pcidevs,
-                                        pcisrc->addr.domain,
-                                        pcisrc->addr.bus,
-                                        pcisrc->addr.slot,
-                                        pcisrc->addr.function);
+        /* We need to look up the actual device because it's the one
+         * that contains the information we care about (unbind_from_stub,
+         * remove_slot, reprobe) */
+        actual = virPCIDeviceListFindByIDs(mgr->activePCIHostdevs,
+                                           pcisrc->addr.domain,
+                                           pcisrc->addr.bus,
+                                           pcisrc->addr.slot,
+                                           pcisrc->addr.function);
 
         /* Appropriate values for the unbind_from_stub, remove_slot
          * and reprobe properties of the device were set earlier
          * by virPCIDeviceDetach() */
-        if (pci) {
+        if (actual) {
             VIR_DEBUG("Saving network configuration of PCI device %s",
-                      virPCIDeviceGetName(pci));
+                      virPCIDeviceGetName(actual));
             hostdev->origstates.states.pci.unbind_from_stub =
-                virPCIDeviceGetUnbindFromStub(pci);
+                virPCIDeviceGetUnbindFromStub(actual);
             hostdev->origstates.states.pci.remove_slot =
-                virPCIDeviceGetRemoveSlot(pci);
+                virPCIDeviceGetRemoveSlot(actual);
             hostdev->origstates.states.pci.reprobe =
-                virPCIDeviceGetReprobe(pci);
+                virPCIDeviceGetReprobe(actual);
         }
     }
 
@@ -898,17 +901,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr mgr,
 
         if (virHostdevIsPCINetDevice(hostdev)) {
             virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
-            virPCIDevicePtr pci;
+            virPCIDevicePtr actual;
 
-            pci = virPCIDeviceListFindByIDs(pcidevs,
-                                            pcisrc->addr.domain,
-                                            pcisrc->addr.bus,
-                                            pcisrc->addr.slot,
-                                            pcisrc->addr.function);
+            actual = virPCIDeviceListFindByIDs(mgr->inactivePCIHostdevs,
+                                               pcisrc->addr.domain,
+                                               pcisrc->addr.bus,
+                                               pcisrc->addr.slot,
+                                               pcisrc->addr.function);
 
-            if (pci) {
+            if (actual) {
                 VIR_DEBUG("Restoring network configuration of PCI device %s",
-                          virPCIDeviceGetName(pci));
+                          virPCIDeviceGetName(actual));
                 virHostdevNetConfigRestore(hostdev, mgr->stateDir,
                                            oldStateDir);
             }
-- 
2.5.0




More information about the libvir-list mailing list