From: Chris Wright Date: Fri, 23 Jul 2010 09:25:24 +0000 (+0200) Subject: pciSharesBusWithActive fails to find multiple devices on bus X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f4828ca353aabd559f196cedbca1daecf4e0609b;p=libvirt.git pciSharesBusWithActive fails to find multiple devices on bus 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() --- diff --git a/src/util/pci.c b/src/util/pci.c index b2e16738bb..6d0ca24f6c 100644 --- a/src/util/pci.c +++ b/src/util/pci.c @@ -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))