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. Not good.
Fix the typo.
Cc: Alex Williamson <alex.williamson(a)redhat.com>
Cc: Don Dutile <ddutile(a)redhat.com>
Cc: Chris Lalancette <clalance(a)redhat.com>
Signed-off-by: Chris Wright <chrisw(a)redhat.com>
---
src/util/pci.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/util/pci.c b/src/util/pci.c
index b2e1673..6d0ca24 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))