From f4828ca353aabd559f196cedbca1daecf4e0609b Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Fri, 23 Jul 2010 11:25:24 +0200 Subject: [PATCH] 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() --- src/util/pci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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)) -- 2.39.5