]> xenbits.xensource.com Git - libvirt.git/commitdiff
pciSharesBusWithActive fails to find multiple devices on bus
authorChris Wright <chrisw@redhat.com>
Fri, 23 Jul 2010 09:25:24 +0000 (11:25 +0200)
committerDaniel Veillard <veillard@redhat.com>
Fri, 23 Jul 2010 09:25:24 +0000 (11:25 +0200)
The first conditional is always true which means the iterator will
never find another device on the same bus.

    if (dev->domain != check->domain ||
        dev->bus != check->bus ||
  ----> (check->slot == check->slot &&
         check->function == check->function)) <-----

The goal of that check is to verify that the device is either:

  in a different pci domain
  on a different bus
  is the same identical device

This means libvirt may issue a secondary bus reset when there are
devices
on that bus that actively in use by the host or another guest.

* src/util/pci.c: fix a bogus test in pciSharesBusWithActive()

src/util/pci.c

index b2e16738bb51e732ac5cd8ba69f299522ba407fc..6d0ca24f6c19672c4a2c21900290ec467e286f5e 100644 (file)
@@ -446,10 +446,11 @@ pciSharesBusWithActive(pciDevice *dev, pciDevice *check, void *data)
 {
     pciDeviceList *activeDevs = data;
 
+    /* Different domain, different bus, or simply identical device */
     if (dev->domain != check->domain ||
         dev->bus != check->bus ||
-        (check->slot == check->slot &&
-         check->function == check->function))
+        (dev->slot == check->slot &&
+         dev->function == check->function))
         return 0;
 
     if (activeDevs && !pciDeviceListFind(activeDevs, check))