On 2012年12月04日 18:38, Jiri Denemark wrote:
Unmanaged PCI devices were only leaked if pciDeviceListAdd failed but
managed devices were always leaked. And leaking PCI device is likely to
leave PCI config file descriptor open. This patch fixes
qemuReattachPciDevice to either free the PCI device or add it to the
inactivePciHostdevs list.
---
  src/qemu/qemu_hostdev.c | 14 +++++++-------
  1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
index b79319e..a748b8b 100644
--- a/src/qemu/qemu_hostdev.c
+++ b/src/qemu/qemu_hostdev.c
@@ -546,10 +546,8 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
      }

      /* Loop 9: Now steal all the devices from pcidevs */
-    while (pciDeviceListCount(pcidevs)>  0) {
-        pciDevice *dev = pciDeviceListGet(pcidevs, 0);
-        pciDeviceListSteal(pcidevs, dev);
-    }
+    while (pciDeviceListCount(pcidevs)>  0)
+        pciDeviceListStealIndex(pcidevs, 0);

      ret = 0;
      goto cleanup;
@@ -818,7 +816,8 @@ void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr 
driver)
       * successfully, it must have been inactive.
       */
      if (!pciDeviceGetManaged(dev)) {
-        pciDeviceListAdd(driver->inactivePciHostdevs, dev);
+        if (pciDeviceListAdd(driver->inactivePciHostdevs, dev)<  0)
+            pciFreeDevice(dev);
          return;
      }

@@ -835,6 +834,7 @@ void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr 
driver)
                    err ? err->message : _("unknown error"));
          virResetError(err);
      }
+    pciFreeDevice(dev);
  }

This produces the similar problem 1/4 tries to fix. pciDeviceListFree
right after will free the whole list. Except this, the using of
pciDeviceListStealIndex is nice.

Osier

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to