linux/drivers/acpi
Prarit Bhargava 6af8bef14d PCI hotplug: acpiphp: Prevent deadlock on PCI-to-PCI bridge remove
I originally submitted a patch to workaround this by pushing all Ejection
Requests and Device Checks onto the kacpi_hotplug queue.

http://marc.info/?l=linux-acpi&m=131678270930105&w=2

The patch is still insufficient in that Bus Checks also need to be added.

Rather than add all events, including non-PCI-hotplug events, to the
hotplug queue, mjg suggested that a better approach would be to modify
the acpiphp driver so only acpiphp events would be added to the
kacpi_hotplug queue.

It's a longer patch, but at least we maintain the benefit of having separate
queues in ACPI.  This, of course, is still only a workaround the problem.
As Bjorn and mjg pointed out, we have to refactor a lot of this code to do
the right thing but at this point it is a better to have this code working.

The acpi core places all events on the kacpi_notify queue.  When the acpiphp
driver is loaded and a PCI card with a PCI-to-PCI bridge is removed the
following call sequence occurs:

cleanup_p2p_bridge()
	    -> cleanup_bridge()
		    -> acpi_remove_notify_handler()
			    -> acpi_os_wait_events_complete()
				    -> flush_workqueue(kacpi_notify_wq)

which is the queue we are currently executing on and the process will hang.

Move all hotplug acpiphp events onto the kacpi_hotplug workqueue.  In
handle_hotplug_event_bridge() and handle_hotplug_event_func() we can simply
push the rest of the work onto the kacpi_hotplug queue and then avoid the
deadlock.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: mjg@redhat.com
Cc: bhelgaas@google.com
Cc: linux-acpi@vger.kernel.org
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
2011-10-14 09:05:31 -07:00
..
acpica acpica: ACPI_MAX_SLEEP should be 2 sec, not 20 2011-08-29 23:08:20 -04:00
apei ACPI APEI: Add Kconfig option IRQ_WORK for GHES 2011-08-11 15:42:09 -04:00
ac.c treewide: fix potentially dangerous trailing ';' in #defined values/expressions 2011-07-21 14:10:00 +02:00
acpi_ipmi.c IPMI/ACPI: Add the IPMI opregion driver to enable ACPI to access BMC controller 2010-12-14 00:22:14 -05:00
acpi_memhotplug.c
acpi_pad.c ACPI: minor printk format change in acpi_pad 2011-03-23 01:36:45 -04:00
atomicio.c x86: remove 32-bit versions of readq()/writeq() 2011-05-25 08:39:44 -07:00
battery.c Merge branch 'battery' into release 2011-08-05 22:16:42 -04:00
blacklist.c Merge branch 'msi-dmi' into release 2010-10-08 22:37:46 -04:00
bus.c ACPI: APEI build fix 2011-08-03 11:15:59 -04:00
button.c ACPI button: remove unused procfs I/F 2011-03-22 23:20:35 -04:00
cm_sbs.c
container.c
custom_method.c ACPI: Split out custom_method functionality into an own driver 2011-05-29 01:50:40 -04:00
debugfs.c ACPI: Split out custom_method functionality into an own driver 2011-05-29 01:50:40 -04:00
dock.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
ec_sys.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
ec.c Merge branch 'ec-cleanup' into release 2011-05-29 04:40:39 -04:00
event.c llseek: automatically add .llseek fop 2010-10-15 15:53:27 +02:00
fan.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
glue.c ACPI / PM: Drop special ACPI wakeup flags 2011-01-07 01:18:00 -05:00
hed.c ACPI Hardware Error Device (PNP0C33) support 2010-05-19 22:40:24 -04:00
internal.h ACPI: Cleanup custom_method debug stuff 2011-05-29 01:50:04 -04:00
Kconfig Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-05-29 11:19:16 -07:00
Makefile Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-05-29 11:19:16 -07:00
numa.c x86-64, NUMA: Unify {acpi|amd}_{numa_init|scan_nodes}() arguments and return values 2011-02-16 12:13:06 +01:00
nvs.c ACPI / PM: Use existing ACPI iomaps for NVS save/restore (v2) 2011-02-24 19:58:42 +01:00
osl.c PCI hotplug: acpiphp: Prevent deadlock on PCI-to-PCI bridge remove 2011-10-14 09:05:31 -07:00
pci_bind.c
pci_irq.c ACPI: fix CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS 2011-07-16 18:24:17 -04:00
pci_link.c ACPI: Use syscore_ops instead of sysdev class and sysdev 2011-03-18 18:22:21 -04:00
pci_root.c ACPI: fix 80 char overflow 2011-07-14 00:14:05 -04:00
pci_slot.c
power.c ACPI / PM: Check status of power resources under mutexes 2011-01-12 05:05:39 -05:00
proc.c ACPI / PM: Use device wakeup flags for handling ACPI wakeup devices 2011-01-07 01:17:41 -05:00
processor_core.c ACPI: processor: fix processor_physically_present in UP kernel 2011-05-29 02:17:56 -04:00
processor_driver.c ACPI: use __init where possible in processor driver 2011-03-02 20:56:53 -05:00
processor_idle.c x86 idle: clarify AMD erratum 400 workaround 2011-05-29 03:38:57 -04:00
processor_perflib.c [CPUFREQ] use dynamic debug instead of custom infrastructure 2011-05-04 11:50:57 -04:00
processor_thermal.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
processor_throttling.c Merge branch 'x86/urgent' into x86-mm 2011-05-02 14:16:47 +02:00
reboot.c ACPI: Make sure the FADT is at least rev 2 before using the reset register 2011-03-22 23:52:49 -04:00
sbs.c Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-08-02 21:17:02 -10:00
sbshc.c
sbshc.h
scan.c ACPI / PM: Avoid infinite recurrence while registering power resources 2011-04-26 11:33:18 +02:00
sleep.c ACPI: DMI workaround for Asus A8N-SLI Premium and Asus A8N-SLI DELUX 2011-07-30 01:40:57 -04:00
sleep.h ACPI: static sleep_states[] and acpi_gts_bfs_check 2010-10-19 13:44:37 -04:00
sysfs.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
tables.c
thermal.c ACPI: constify ops structs 2011-07-16 18:36:17 -04:00
utils.c
video_detect.c ACPI / Video: Probe for output switch method when searching video devices. 2011-02-12 01:40:16 +01:00
video.c Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-08-02 21:17:02 -10:00
wakeup.c ACPI / Wakeup: Enable button GPEs unconditionally during initialization 2011-02-12 01:39:53 +01:00