Files
linux/arch/x86/include/asm
Jiang Liu b4b55cda58 x86/PCI: Refine the way to release PCI IRQ resources
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 c03b3b0738 ("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 3eec595235
("x86, irq, PCI: Keep IRQ assignment for PCI devices during
suspend/hibernation") and 9eabc99a63 ("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 cffe0a2b5a ("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: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-02-05 15:09:26 +01:00
..
2014-08-26 13:45:49 -04:00
2014-12-11 11:35:02 +01:00
2014-11-11 22:23:11 +00:00
2014-05-02 11:34:17 -07:00
2012-03-28 18:11:12 +01:00
2014-03-04 21:47:51 +01:00
2011-04-18 09:26:48 -07:00
2014-05-08 08:15:34 +02:00
2013-08-05 06:35:33 -07:00
2013-02-03 18:16:27 -05:00
2010-10-26 16:52:08 -07:00
2012-06-25 13:48:30 +02:00
2014-09-22 13:35:52 +02:00
2014-12-18 09:39:51 +01:00
2011-07-22 14:39:50 +09:30
2013-04-22 15:45:03 +09:30
2014-02-27 08:07:39 -08:00
2014-11-18 00:58:54 +01:00
2014-09-01 10:15:31 +02:00
2014-10-28 10:47:56 +01:00
2011-03-15 15:34:15 -07:00
2012-02-20 12:52:05 -08:00
2014-06-06 16:08:11 -07:00
2014-06-04 16:53:57 -07:00
2014-04-18 14:20:46 +02:00
2014-11-23 13:56:19 -08:00
2012-03-28 18:11:12 +01:00
2014-12-05 13:57:33 +01:00