diff options
author | Zhang Rui <rui.zhang@intel.com> | 2008-08-27 22:05:06 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-09-23 23:12:38 -0400 |
commit | 19cd847ab24fefe9e50101ec94479e0400a08650 (patch) | |
tree | 9af663d1f43e59d6ce3f942d89b910dda5e1c542 /include/acpi | |
parent | 6bd00a61ab63d4ceb635ae0316353c11c900b8d8 (diff) |
ACPI: fix hotplug race
The hotplug notification handler and drivers' notification handler all
run in one workqueue. Before hotplug removes an acpi device, the
device driver's notification handler is already be recorded to run just
after global notification handler. After hotplug notification handler
runs, acpica will notice a NULL notification handler and crash.
So now we run run hotplug in another workqueue and wait
for all acpi notication handlers finish.
This was found in battery hotplug, but actually all
hotplug can be affected.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include/acpi')
-rw-r--r-- | include/acpi/acpiosxf.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 3f93a6b4e17f..b91440ac0d16 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -193,6 +193,9 @@ acpi_status | |||
193 | acpi_os_execute(acpi_execute_type type, | 193 | acpi_os_execute(acpi_execute_type type, |
194 | acpi_osd_exec_callback function, void *context); | 194 | acpi_osd_exec_callback function, void *context); |
195 | 195 | ||
196 | acpi_status | ||
197 | acpi_os_hotplug_execute(acpi_osd_exec_callback function, void *context); | ||
198 | |||
196 | void acpi_os_wait_events_complete(void *context); | 199 | void acpi_os_wait_events_complete(void *context); |
197 | 200 | ||
198 | void acpi_os_sleep(acpi_integer milliseconds); | 201 | void acpi_os_sleep(acpi_integer milliseconds); |