• Jiang Liu's avatar
    x86/PCI: Refine the way to release PCI IRQ resources · b4b55cda
    Jiang Liu authored
    Some PCI device drivers assume that pci_dev->irq won't change after
    calling pci_disable_device() and pci_enable_device() during suspend and
    resume.
    
    Commit c03b3b07 ("x86, irq, mpparse: Release IOAPIC pin when
    PCI device is disabled") frees PCI IRQ resources when pci_disable_device()
    is called and reallocate IRQ resources when pci_enable_device() is
    called again. This breaks above assumption. So commit 3eec5952
    ("x86, irq, PCI: Keep IRQ assignment for PCI devices during
    suspend/hibernation") and 9eabc99a ("x86, irq, PCI: Keep IRQ
    assignment for runtime power management") fix the issue by avoiding
    freeing/reallocating IRQ resources during PCI device suspend/resume.
    They achieve this by checking dev.power.is_prepared and
    dev.power.runtime_status.  PM maintainer, Rafael, then pointed out that
    it's really an ugly fix which leaking PM internal state information to
    IRQ subsystem.
    
    Recently David Vrabel <david.vrabel@citrix.com> also reports an
    regression in pciback driver caused by commit cffe0a2b ("x86, irq:
    Keep balance of IOAPIC pin reference count"). Please refer to:
    http://lkml.org/lkml/2015/1/14/546
    
    So this patch refine the way to release PCI IRQ resources. Instead of
    releasing PCI IRQ resources in pci_disable_device()/
    pcibios_disable_device(), we now release it at driver unbinding
    notification BUS_NOTIFY_UNBOUND_DRIVER. In other word, we only release
    PCI IRQ resources when there's no driver bound to the PCI device, and
    it keeps the assumption that pci_dev->irq won't through multiple
    invocation of pci_enable_device()/pci_disable_device().
    Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    b4b55cda
intel_mid_pci.c 9.2 KB