kernel_optimize_test/drivers/acpi
Hans de Goede 7231ed1a81 ACPI / video: Fix circular lock dependency issue in the video-detect code
Before this commit, the following would happen:

 a) acpi_video_get_backlight_type() gets called
 b) acpi_video_get_backlight_type() calls acpi_video_init_backlight_type()
 c) acpi_video_init_backlight_type() locks its function static init_mutex
 d) acpi_video_init_backlight_type() calls backlight_register_notifier()
 e) backlight_register_notifier() takes its notifier-chain lock

And when the backlight notifier chain gets called we've:

 1) blocking_notifier_call_chain() gets called
 2) blocking_notifier_call_chain() takes the notifier-chain lock
 3) blocking_notifier_call_chain() calls acpi_video_backlight_notify()
 4) acpi_video_backlight_notify() calls acpi_video_get_backlight_type()
 5) acpi_video_get_backlight_type() calls acpi_video_init_backlight_type()
 6) acpi_video_init_backlight_type() locks its function static init_mutex

So in the first call sequence we have:

 a) init_mutex gets locked
 b) notifier-chain gets locked

and in the second call sequence we have:

 1) notifier-chain gets locked
 2) init_mutex gets locked

And we've a circular locking dependency. This specific locking dependency
is fixable without using the big hammer otherwise known as a workqueue,
but further analysis shows a similar problem with the backlight notifier
chain lock vs register_count_mutex from drivers/acpi/acpi_video.c,
and fixing that becomes problematic.

So this commit simply fixes this with the big hammer, performance
wise this is a non issue as we expect the work to get scheduled
exactly zero or one times during normal system use.

Fixes: 93a291dfaf (ACPI / video: Move backlight notifier to video_detect.c)
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reported-and-tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-08-14 11:20:20 +02:00
..
acpica Revert 'Revert "ACPICA: Permanently set _REV to the value '2'."' 2015-07-03 01:06:04 +02:00
apei Power management and ACPI material for v4.2-rc1 2015-06-23 14:18:07 -07:00
pmic
ac.c ACPI / AC: constify DMI system id table 2015-06-15 14:14:49 +02:00
acpi_apd.c
acpi_cmos_rtc.c
acpi_extlog.c
acpi_ipmi.c
acpi_lpat.c
acpi_lpss.c ACPI / LPSS: Fix up acpi_lpss_create_device() 2015-07-07 00:31:47 +02:00
acpi_memhotplug.c
acpi_pad.c sched/topology: Rename topology_thread_cpumask() to topology_sibling_cpumask() 2015-05-27 15:22:15 +02:00
acpi_platform.c ACPI / scan: Parse _CCA and setup device coherency 2015-06-15 14:40:48 +02:00
acpi_pnp.c ACPI / PNP: add two IDs to list for PNPACPI device enumeration 2015-05-04 16:03:12 +02:00
acpi_processor.c ACPI / processor: Introduce invalid_phys_cpuid() 2015-05-13 23:28:16 +02:00
acpi_video.c ACPI / video: Make acpi_video_unregister_backlight() private 2015-06-19 01:12:50 +02:00
battery.c ACPI / battery: mark DMI table as __initconst 2015-06-15 14:23:44 +02:00
battery.h
bgrt.c
blacklist.c ACPI / init: Make it possible to override _REV 2015-07-03 01:06:00 +02:00
bus.c ACPI / init: Switch over platform to the ACPI mode later 2015-06-10 23:51:27 +02:00
button.c
cm_sbs.c
container.c
custom_method.c
debugfs.c
device_pm.c ACPI / PM: Use target_state to set the device power state 2015-07-28 16:29:08 +02:00
dock.c
ec_sys.c
ec.c ACPI / EC: Fix a code coverity issue when QR_EC transactions are failed. 2015-06-15 14:35:59 +02:00
event.c
fan.c ACPI / PM: Rework device power management to follow ACPI 6 2015-05-16 01:55:35 +02:00
glue.c ACPI / scan: Parse _CCA and setup device coherency 2015-06-15 14:40:48 +02:00
gsi.c
hed.c ACPI / HED: constify ACPI device ids 2015-06-15 14:28:32 +02:00
int340x_thermal.c
internal.h Additional ACPICA material for v4.2-rc1 2015-07-02 17:11:28 -07:00
ioapic.c
Kconfig Additional ACPICA material for v4.2-rc1 2015-07-02 17:11:28 -07:00
Makefile The libnvdimm sub-system introduces, in addition to the libnvdimm-core, 2015-06-29 10:34:42 -07:00
nfit.c nfit: add support for NVDIMM "latch" flag 2015-07-10 14:43:50 -04:00
nfit.h nfit: add support for NVDIMM "latch" flag 2015-07-10 14:43:50 -04:00
numa.c acpi: Add acpi_map_pxm_to_online_node() 2015-06-26 11:23:38 -04:00
nvs.c
osl.c ACPI / PNP: Reserve ACPI resources at the fs_initcall_sync stage 2015-07-06 23:52:21 +02:00
pci_irq.c Power management and ACPI material for v4.2-rc1 2015-06-23 14:18:07 -07:00
pci_link.c
pci_root.c PCI: Don't clear ASPM bits when the FADT declares it's unsupported 2015-04-09 14:20:11 -05:00
pci_slot.c
power.c ACPI / PM: Turn power resources on and off in the right order during resume 2015-05-25 23:59:54 +02:00
proc.c
processor_core.c ACPI / processor: Introduce invalid_phys_cpuid() 2015-05-13 23:28:16 +02:00
processor_driver.c
processor_idle.c ACPI / processor: constify DMI system id table 2015-06-15 14:29:48 +02:00
processor_pdc.c ACPI / processor: Introduce invalid_logical_cpuid() 2015-05-13 23:28:14 +02:00
processor_perflib.c
processor_thermal.c
processor_throttling.c
property.c ACPI / property: Define a symbol for PRP0001 2015-05-22 23:57:14 +02:00
reboot.c
resource.c Merge branches 'pm-cpuidle', 'pm-cpufreq' and 'acpi-resources' 2015-07-16 23:47:19 +02:00
sbs.c ACPI / SBS: Enable battery manager when present 2015-04-29 00:04:29 +02:00
sbshc.c ACPI / SBS: Add 5 us delay to fix SBS hangs on MacBook 2015-04-30 23:18:11 +02:00
sbshc.h
scan.c ACPI / scan: Add support for ACPI _CLS device matching 2015-07-07 01:55:20 +02:00
sleep.c
sleep.h
sysfs.c
tables.c
thermal.c thermal: of: fix cooling device weights in device tree 2015-05-04 21:27:50 -07:00
utils.c acpi-video-detect: video: Make video_detect code part of the video module 2015-06-19 01:10:36 +02:00
video_detect.c ACPI / video: Fix circular lock dependency issue in the video-detect code 2015-08-14 11:20:20 +02:00
wakeup.c