pci=assign-busses w/ SR-IOV capable devices can cause bridge downstream ports to disappear

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I think I found an issue with the pci=assign-busses option when trying
to work around a system that has SR-IOV disabled. I believe I have
narrowed down the issue to a problem of bridge routing but I am not
certain how best to go about resolving the issue. Below is a snippet
from an lspci -t when the devices appear as they are supposed to. With
the patch included at the end of the email applied it changes to the
broken layout. I originally found the issue while testing SR-IOV on a
system with 7 82576 quad port adapters.

The issue appears to occur when the upstream secondary bus matches one
of the downstream secondary buses. When it occurs the system is unable
to detect some or all of the downstream ports. I generated the patch
below as a debugging step so that I could target specific buses when
reproducing the issue. In the example below I saw the issue when the
secondary bus on the upstream port was 3 or 4, but once it went to 5
the devices appeared again without issue. I was also able to work around
my SR-IOV issue by increasing the buses sufficiently that there was no
upstream/downstream overlap. The issue doesn't appear to be bridge
specific as I can recreate it on Intel Corporation 6311ESB/6321ESB PCI
Express Upstream Port, Integrated Device Technology, Inc. PES12N3A PCI
Express Switch, and a Integrated Device Technology, Inc. PES24N3A PCI
Express Switch.

Thanks,

Alex

What it should looks like without the change:
-[0000:00]-+-00.0
          +-01.0-[0000:01-04]----00.0-[0000:02-04]--+-02.0-[0000:03]--+-00.0
          |                                         |                 \-00.1
          |                                         \-04.0-[0000:04]--+-00.0
          |                                                           \-00.1

What it looks like when broken:
-[0000:00]-+-00.0
          +-01.0-[0000:02-03]----00.0-[0000:03-03]--
          |
          |
          |


diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 40e75f6..62c0c17 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1094,6 +1094,10 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
	/* Reserve buses for SR-IOV capability. */
	max += pci_iov_bus_range(bus);

+	/* Shift all bus numbers by 1 in the hopes of creating a conflict */
+	if (bus->number == 0)
+		max += 1;
+
	/*
	 * After performing arch-dependent fixup of the bus, look behind
	 * all PCI-to-PCI bridges on this bus.

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux