Skip to contentSkip to conversation

pci: ARI is a PCIe v2 feature

PATCH RESEND Applied Chris Wright 2 participants 4 messages Jul 13, 2011 – Jul 22, 2011 PCI

lore
Share & tools
lore
#0 lore raw

PATCH RESEND 1/1 pci: ARI is a PCIe v2 feature

The function pci_enable_ari() may mistakenly set the downstream port of a v1 PCIe switch in ARI Forwarding mode. This is a PCIe v2 feature, and with an SR-IOV device on that switch port believing the switch above is ARI capable it may attempt to use functions 8-255, translating into invalid (non-zero) device numbers for that bus. This has been seen to cause Completion Timeouts and general misbehaviour including hangs and panics.

---

 drivers/pci/pci.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
drivers/pci/pci.c +6 -1
index 2c5b9b9..7f83236 100644
@@ -1905,7 +1905,7 @@ void pci_enable_ari(struct pci_dev *dev)
 {
 	int pos;
 	u32 cap;
-	u16 ctrl;
+	u16 flags, ctrl;
 	struct pci_dev *bridge;
 
 	if (!pci_is_pcie(dev) || dev->devfn)
@@ -1923,6 +1923,11 @@ void pci_enable_ari(struct pci_dev *dev)
 	if (!pos)
 		return;
 
+	/* ARI is a PCIe v2 feature */
+	pci_read_config_word(bridge, pos + PCI_EXP_FLAGS, &flags);
+	if ((flags & PCI_EXP_FLAGS_VERS) < 2)
+		return;
+
 	pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap);
 	if (!(cap & PCI_EXP_DEVCAP2_ARI))
 		return;
#1 lore raw
Quoted 7 lines · On Wed, 13 Jul 2011 10:14:33 -0700 Chris Wright <[email protected]> wrote:

The function pci_enable_ari() may mistakenly set the downstream port of a v1 PCIe switch in ARI Forwarding mode. This is a PCIe v2 feature, and with an SR-IOV device on that switch port believing the switch above is ARI capable it may attempt to use functions 8-255, translating into invalid (non-zero) device numbers for that bus. This has been seen to cause Completion Timeouts and general misbehaviour including hangs and panics.

Thanks Chris, your earlier one is still sitting in my queue, but I wasn't going to send it for 3.0 as it didn't seem that critical. Do you think it is? If so you can send it directly to Linus with my ack as I don't have anything else queued, or just wait until the merge window when it will be put into the stable tree as well.

Thanks,
Jesse

#2 lore raw
Quoted 11 lines · * Jesse Barnes ([email protected]) wrote:
Quoted 7 lines · On Wed, 13 Jul 2011 10:14:33 -0700 Chris Wright <[email protected]> wrote:

The function pci_enable_ari() may mistakenly set the downstream port of a v1 PCIe switch in ARI Forwarding mode. This is a PCIe v2 feature, and with an SR-IOV device on that switch port believing the switch above is ARI capable it may attempt to use functions 8-255, translating into invalid (non-zero) device numbers for that bus. This has been seen to cause Completion Timeouts and general misbehaviour including hangs and panics.

Quoted 5 lines

Thanks Chris, your earlier one is still sitting in my queue, but I wasn't going to send it for 3.0 as it didn't seem that critical. Do you think it is? If so you can send it directly to Linus with my ack as I don't have anything else queued, or just wait until the merge window when it will be put into the stable tree as well.

Cool, just wanted to make sure it wasn't lost. I think it's fine to merge in next window and let it filter back to -stable. While I've seen it cause panics, it's not a regression and the conditions required are very specific (possibly including buggy BIOS).

thanks,
-chris

Applied
#3 lore raw
In reply to Chris Wright
Quoted 7 lines · On Wed, 13 Jul 2011 10:14:33 -0700 Chris Wright <[email protected]> wrote:

The function pci_enable_ari() may mistakenly set the downstream port of a v1 PCIe switch in ARI Forwarding mode. This is a PCIe v2 feature, and with an SR-IOV device on that switch port believing the switch above is ARI capable it may attempt to use functions 8-255, translating into invalid (non-zero) device numbers for that bus. This has been seen to cause Completion Timeouts and general misbehaviour including hangs and panics.

Applied, thanks.

Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center