linux/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 ACPI/PMIC: Fix typo in MODULE_DESCRIPTION in intel_pmic_crc.c 2015-03-26 21:34:51 +01:00
ac.c ACPI / AC: constify DMI system id table 2015-06-15 14:14:49 +02:00
acpi_apd.c ACPI: add AMD ACPI2Platform device support for x86 system 2015-02-06 15:42:16 +01:00
acpi_cmos_rtc.c ACPI / RTC: Fix CMOS RTC opregion handler accesses to wrong addresses 2014-09-08 15:38:41 +02:00
acpi_extlog.c ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
acpi_ipmi.c
acpi_lpat.c ACPI / LPAT: Common table processing functions 2015-01-29 21:02:10 +08:00
acpi_lpss.c ACPI / LPSS: Fix up acpi_lpss_create_device() 2015-07-07 00:31:47 +02:00
acpi_memhotplug.c ACPICA: Resources: Provide common part for struct acpi_resource_address structures. 2015-01-26 16:09:56 +01:00
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 ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
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 ACPI / button: Do not propagate wakeup-from-suspend events 2014-07-23 00:59:04 +02:00
cm_sbs.c ACPI: Revert "ACPI: Remove CONFIG_ACPI_PROCFS_POWER and cm_sbsc.c" 2014-05-06 01:52:09 +02:00
container.c ACPI / hotplug: Generate online uevents for ACPI containers 2014-09-21 02:58:18 +02:00
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 driver core / ACPI: Represent ACPI companions using fwnode_handle 2015-03-16 23:49:03 +01:00
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 netlink: make nlmsg_end() and genlmsg_end() void 2015-01-18 01:03:45 -05:00
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 ACPI: move arm64 GSI IRQ model to generic GSI IRQ layer 2015-03-26 15:13:09 +00:00
hed.c ACPI / HED: constify ACPI device ids 2015-06-15 14:28:32 +02:00
int340x_thermal.c ACPI/int340x_thermal: enumerate INT3401 for Intel SoC DTS thermal driver 2015-01-06 08:17:14 +08:00
internal.h Additional ACPICA material for v4.2-rc1 2015-07-02 17:11:28 -07:00
ioapic.c x86/irq, ACPI: Implement ACPI driver to support IOAPIC hotplug 2015-02-05 15:09:26 +01:00
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 ACPI: Clean up acpi_os_map/unmap_memory() to eliminate __iomem. 2014-05-27 18:13:08 +02:00
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 ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
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 ACPI / processor: Make acpi_cpu_soft_notify() process CPU FROZEN events 2014-08-06 22:22:03 +02:00
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 ACPI / processor: Rework processor throttling with work_on_cpu() 2014-02-27 00:21:05 +01:00
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 ACPI / PM: Enable all wakeup GPEs in suspend-to-idle 2015-03-30 01:52:02 +02:00
sleep.h ACPI / sleep: Drop acpi_suspend() which is not used 2015-03-18 12:53:21 +01:00
sysfs.c ACPI / sysfs: Treat the count field of counter_show() as unsigned 2015-03-10 01:03:30 +01:00
tables.c ACPI / table: Print GIC information when MADT is parsed 2015-03-25 11:49:31 +00:00
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