Re: [PATCH] pci: Do not read INTx PIN and LINE registers for virtual functions

From: Bjorn Helgaas
Date: Wed Feb 28 2018 - 17:06:54 EST


On Wed, Jan 17, 2018 at 07:30:29PM +0100, KarimAllah Ahmed wrote:
> ... since INTx is not supported by-spec for virtual functions.
>
> Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
> Cc: linux-pci@xxxxxxxxxxxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx
> Signed-off-by: KarimAllah Ahmed <karahmed@xxxxxxxxx>
> Signed-off-by: Jan H. Schönherr <jschoenh@xxxxxxxxx>

Applied to pci/virtualization for v4.17, thanks!

I tweaked the changelog to include the motivation:

commit 16edf1c6345ab177ccf1e8b5ba3324ee01a50eb7
Author: KarimAllah Ahmed <karahmed@xxxxxxxxx>
Date: Wed Jan 17 19:30:29 2018 +0100

PCI/IOV: Skip INTx config reads for VFs

Per PCIe r4.0, sec 9.2.1.4, VFs can not implement INTX, and their Interrupt
Line and Interrupt Pin registers must be RO Zero. Some devices have
thousands of VFs, so skip reading the registers as an optimization.

Signed-off-by: KarimAllah Ahmed <karahmed@xxxxxxxxx>
Signed-off-by: Jan H. Schönherr <jschoenh@xxxxxxxxx>
[bhelgaas: changelog, comment]
Signed-off-by: Bjorn Helgaas <helgaas@xxxxxxxxxx>

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 489660d0d384..a1cddca37793 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1230,6 +1230,13 @@ static void pci_read_irq(struct pci_dev *dev)
{
unsigned char irq;

+ /* VFs are not allowed to use INTx, so skip the config reads */
+ if (dev->is_virtfn) {
+ dev->pin = 0;
+ dev->irq = 0;
+ return;
+ }
+
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
dev->pin = irq;
if (irq)