linux/drivers/power/sequencing
Bartosz Golaszewski 2d5a7d406e power: sequencing: fix ABBA deadlock in pwrseq_device_unregister()
The pwrseq core takes three locks in consistent order everywhere:

  pwrseq_sem -> pwrseq->rw_lock -> pwrseq->state_lock

pwrseq_get() -> pwrseq_match_device() takes pwrseq_sem for reading, then
rw_lock for reading. pwrseq_power_on()/pwrseq_power_off() take rw_lock
for reading and then state_lock.

pwrseq_device_unregister() is the only exception, it takes: state_lock,
then rw_lock for writing and finally pwrseq_sem for writing. This created
two potential ABBA deadlock situations that sashiko pointed out.

  - pwrseq_power_on/off() take rw_lock for reading then state_lock, while
    pwrseq_unregister() takes state_lock then rw_lock for writing
  - pwrseq_get() takes pwrseq_sem for reading then rw_lock for reading,
    while pwrseq_unregister() takes rw_lock for writing then pwrseq_sem
    for writing

Reorder the unregister path to taking pwrseq_sem for writing -> rw_lock
for writing and drop the state_lock entirely. This is safe as
enable_count is only ever written under rw_lock held for read (via
pwrseq_unit_enable()/disable(), reached only from pwrseq_power_on/off()),
so holding rw_lock for writing already excludes every other writer and
reader and the active-users WARN() stays race-free without state_lock.

Fixes: 249ebf3f65 ("power: sequencing: implement the pwrseq core")
Closes: https://sashiko.dev/#/patchset/20260616151049.1705503-1-vulab%40iscas.ac.cn
Link: https://patch.msgid.link/20260618-pwrseq-abba-deadlock-v1-1-943a3fd81c06@oss.qualcomm.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
2026-06-22 10:05:39 +02:00
..
core.c power: sequencing: fix ABBA deadlock in pwrseq_device_unregister() 2026-06-22 10:05:39 +02:00
Kconfig power: sequencing: pcie-m2: add SERIAL_DEV_BUS dependency 2026-04-03 14:20:36 +02:00
Makefile power: sequencing: Add the Power Sequencing driver for the PCIe M.2 connectors 2026-01-23 10:05:38 +01:00
pwrseq-pcie-m2.c power: sequencing: pcie-m2: Sort PCI device IDs in ascending order 2026-06-22 10:05:15 +02:00
pwrseq-qcom-wcn.c power: sequencing: qcom-wcn: fix error path for VDDIO handling 2026-02-09 10:32:27 +01:00
pwrseq-thead-gpu.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00