• Rui Wang's avatar
    x86/PCI: Implement pcibios_release_device to release IRQ from IOAPIC · 153654db
    Rui Wang authored
    The revert of 991de2e5 ("PCI, x86: Implement pcibios_alloc_irq()
    and pcibios_free_irq()") causes a problem for IOAPIC hotplug. The
    problem is that IRQs are allocated and freed in pci_enable_device()
    and pci_disable_device(). But there are some drivers which don't call
    pci_disable_device(), and they have good reasons not calling it, so
    if they're using IOAPIC their IRQs won't have a chance to be released
    from the IOAPIC. When this happens IOAPIC hot-removal fails with a
    kernel stack dump and an error message like this:
    
      [149335.697989] pin16 on IOAPIC2 is still in use.
    
    It turns out that we can fix it in a different way without moving IRQ
    allocation into pcibios_alloc_irq(), thus avoiding the regression of
    991de2e5. We can keep the allocation and freeing of IRQs as is
    within pci_enable_device()/pci_disable_device(), without breaking any
    previous assumption of the rest of the system, keeping compatibility
    with both the legacy and the modern drivers. We can accomplish this by
    implementing the existing __weak hook of pcibios_release_device() thus
    when a pci device is about to be deleted we get notified in the hook
    and take the chance to release its IRQ, if any, from the IOAPIC.
    
    Implement pcibios_release_device() for x86 to release any IRQ not released
    by the driver.
    Signed-off-by: default avatarRui Wang <rui.y.wang@intel.com>
    Cc: tony.luck@intel.com
    Cc: linux-pci@vger.kernel.org
    Cc: rjw@rjwysocki.net
    Cc: linux-acpi@vger.kernel.org
    Cc: fengguang.wu@intel.com
    Cc: helgaas@kernel.org
    Cc: kbuild-all@01.org
    Cc: bhelgaas@google.com
    Link: http://lkml.kernel.org/r/1488288869-31290-2-git-send-email-rui.y.wang@intel.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    153654db
common.c 17.4 KB