kernel_optimize_test/drivers/acpi
Lv Zheng 69c841b6dd ACPICA: Update use of acpi_os_wait_events_complete interface.
This patch cleans up all of the acpi_os_wait_events_complete() invocations to
make it to be invoked inside of ACPICA in the way to accommodate Linux's
work queue implementation.

According to the report, current Linux kernel code is facing a boot time
race issue in the acpi_remove_notify_handler(). This is because:
Linux is using work queues to implement a deferred handler call environment
while ACPICA expects OSPM to implement acpi_os_wait_events_complete() using
wait queues.  The position to invoke a "waiter" is not suitable for a
"flusher" as new invocations can be scheduled after this position and
before the deletion of the handler from its management container.

Since the following commit has deleted acpi_os_wait_events_complete()
parameters, it thus might not be possible for OSPM to achieve a safe
removal using wait queues.  This requires ACPICA to be changed accordingly
to "flush" handlers rather than "wait" them to be drain up:

  Commit: 5ff986a2a9db11858247b71fe242fe17617229aa
  Date: Wed, 16 May 2012 13:36:07 -0700
  Subject: Introduce acpi_os_wait_events_complete interface.

  This interface will block until asynchronous events like notifies
  and GPEs are complete. Within ACPICA, it is called before a notify or GPE
  handler is removed. ACPICA BZ 868.

This patch fixes this issue by invoking acpi_os_wait_events_complete() in the
way to "flush" things - it thus should be put to the position after handler
is removed from its management container but before it is destructed.

The technical concerns are:
1. MTX_NAMESPACE is used to protect things that acpi_os_wait_events_complete()
   might be waiting for, thus MTX_NAMESPACE must be unlocked before
   invoking acpi_os_wait_events_complete().
2. MTX_NAMESPACE is also used to implement the serialization of
   acpi_install_notify_handler() and acpi_remove_notify_handler(). This patch
   changes this logic, thus if there are many
   acpi_install/remove_notify_handler() invoked in parallel, the
   acpi_os_wait_events_complete() might face the races which could cause it
   never running to an end.  Normally this will require additional code to
   implement a separate locking facility which is not implemented due to 3.
3. Given ACPICA users will always invoke acpi_install_notify_handler() once
   during Linux module/device initialization and invoke
   acpi_remove_notify_handler() once during module/device finalization,
   problem stated in 2 will not happen in Linux environment due to the
   mutual exclusive module/device existence, this fix thus is sufficient.
Same concerns can apply to acpi_install/remove_gpe_handler(). Reported and
tested: Ronald Vink.  Fixed: Lv Zheng.

References: https://bugzilla.kernel.org/show_bug.cgi?id=60583
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Reported-and-Tested-by: Ronald Vink <ronald.vink@boskalis.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2014-04-20 22:59:37 +02:00
..
acpica ACPICA: Update use of acpi_os_wait_events_complete interface. 2014-04-20 22:59:37 +02:00
apei
ac.c ACPI / AC: recheck adapter status upon battery status changes 2014-03-19 01:57:47 +01:00
acpi_cmos_rtc.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
acpi_extlog.c
acpi_ipmi.c
acpi_lpss.c Merge branches 'pm-qos', 'pm-domains' and 'pm-drivers' 2014-03-20 13:25:36 +01:00
acpi_memhotplug.c
acpi_pad.c
acpi_platform.c
acpi_processor.c
battery.c ACPI / battery: call ACPI notifier chain in acpi_battery_notify 2014-03-19 01:57:46 +01:00
battery.h ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
bgrt.c
blacklist.c
bus.c Merge branch 'acpi-ost' 2014-03-17 13:48:18 +01:00
button.c ACPI / button: Add ACPI Button event via netlink routine 2014-03-19 02:06:15 +01:00
container.c Merge branches 'acpi-cleanup', 'acpi-thermal', 'acpi-pci', 'acpi-lpss' and 'acpi-button' 2014-03-20 13:20:47 +01:00
custom_method.c
debugfs.c
device_pm.c
dock.c ACPI / dock: Drop dock_device_ids[] table 2014-04-07 14:11:35 +02:00
ec_sys.c
ec.c
event.c
fan.c
glue.c
hed.c
internal.h
Kconfig ACPI: Update the ACPI spec information in Kconfig 2014-04-08 21:34:40 +02:00
Makefile
numa.c
nvs.c
osl.c ACPI: Clean up memory allocations 2014-04-04 16:23:33 +02:00
pci_irq.c
pci_link.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
pci_root.c Merge branches 'acpi-cleanup', 'acpi-thermal', 'acpi-pci', 'acpi-lpss' and 'acpi-button' 2014-03-20 13:20:47 +01:00
pci_slot.c
power.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
proc.c
processor_core.c Merge branches 'acpi-processor' and 'pnp' 2014-04-01 22:09:50 +02:00
processor_driver.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
processor_idle.c
processor_perflib.c
processor_thermal.c
processor_throttling.c
reboot.c
resource.c
sbs.c ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
sbshc.c
sbshc.h
scan.c Merge branches 'pm-qos', 'pm-domains' and 'pm-drivers' 2014-03-20 13:25:36 +01:00
sleep.c ACPI / sleep: Add extra checks for HW Reduced ACPI mode sleep states 2014-03-13 22:11:39 +01:00
sleep.h
sysfs.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
tables.c
thermal.c ACPI / thermal: Fix wrong variable usage in debug statement 2014-04-07 14:00:49 +02:00
utils.c ACPI: Clean up memory allocations 2014-04-04 16:23:33 +02:00
video_detect.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
video.c ACPI / video: Favor native backlight interface for ThinkPad Helix 2014-04-07 14:10:21 +02:00
wakeup.c