• Joerg Roedel's avatar
    x86/PCI: Don't alloc pcibios-irq when MSI is enabled · 8affb487
    Joerg Roedel authored
    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 driver's 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.
    Reported-by: default avatarBorislav Petkov <bp@alien8.de>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Jiang Liu <jiang.liu@linux.intel.com>
    8affb487
common.c 16.3 KB