On Fri, Oct 09, 2015 at 12:23:34PM +0200, Joerg Roedel wrote: > From: Joerg Roedel <jroedel@xxxxxxx> > > The pcibios-irq and MSI both use dev->irq to store the IRQ > number. While the MSI code checks for that and frees the > pcibios-irq before overwriting dev->irq, the > pcibios_alloc_irq function does not. > > Usually this is not a problem, as the pcibios-irq is > allocated before probe time of the device and the MSI irq is > allocted from the drivers probe path. > > But there are PCI devices handled by the core kernel and not > by a standard pci driver, like the AMD IOMMU for example. > For the AMD IOMMU a normal pci device driver does not make > sense, because a driver can be forcibly unbound from its > device, which is not a good idea for an IOMMU. > > Nevertheless the PCI core code tries to match the PCI device > implementing the AMD IOMMU against drivers, and > allocates/frees a pcibios IRQ every time it tries out a new > driver. This overwrites the dev->irq field set by > pci_enable_msi() and sets it to 0 in the end (because the > probe fails and the pcibios-irq is freed again). > > On suspend/resume this breaks the kernel, because the irq > descriptor for irq 0 is NULL. > > Fix this by not allocating a pcibios-irq when MSI is > already active. This also has the benefit, that a device > claimed by the core kernel can not be probed by a pci driver > later. > > Cc: Jiang Liu <jiang.liu@xxxxxxxxxxxxxxx> > Reported-by: Borislav Petkov <bp@xxxxxxxxx> > Signed-off-by: Joerg Roedel <jroedel@xxxxxxx> Applied with Thomas' reviewed-by to pci/msi for v4.4, thanks, Joerg! > --- > arch/x86/pci/common.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c > index dc78a4a..6254c06 100644 > --- a/arch/x86/pci/common.c > +++ b/arch/x86/pci/common.c > @@ -675,6 +675,14 @@ int pcibios_add_device(struct pci_dev *dev) > > int pcibios_alloc_irq(struct pci_dev *dev) > { > + /* > + * If the PCI device was already claimed by core code and has > + * MSI enabled, probing of the pcibios irq will overwrite > + * dev->irq. So bail out if MSI is already enabled. > + */ > + if (pci_dev_msi_enabled(dev)) > + return -EBUSY; > + > return pcibios_enable_irq(dev); > } > > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- 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