linux-stable/drivers/acpi
Rafael J. Wysocki c56610a869 ACPI: bus: Rework system-level device notification handling
For ACPI drivers that provide a ->notify() callback and set
ACPI_DRIVER_ALL_NOTIFY_EVENTS in their flags, that callback can be
invoked while either the ->add() or the ->remove() callback is running
without any synchronization at the bus type level which is counter to
the common-sense expectation that notification handling should only be
enabled when the driver is actually bound to the device.  As a result,
if the driver is not careful enough, it's ->notify() callback may crash
when it is invoked too early or too late [1].

This issue has been amplified by commit d6fb6ee182 ("ACPI: bus: Drop
driver member of struct acpi_device") that made acpi_bus_notify() check
for the presence of the driver and its ->notify() callback directly
instead of using an extra driver pointer that was only set and cleared
by the bus type code, but it was present before that commit although
it was harder to reproduce then.

It can be addressed by using the observation that
acpi_device_install_notify_handler() can be modified to install the
handler for all types of events when ACPI_DRIVER_ALL_NOTIFY_EVENTS is
set in the driver flags, in which case acpi_bus_notify() will not need
to invoke the driver's ->notify() callback any more and that callback
will only be invoked after acpi_device_install_notify_handler() has run
and before acpi_device_remove_notify_handler() runs, which implies the
correct ordering with respect to the other ACPI driver callbacks.

Modify the code accordingly and while at it, drop two redundant local
variables from acpi_bus_notify() and turn its description comment into
a proper kerneldoc one.

Fixes: d6fb6ee182 ("ACPI: bus: Drop driver member of struct acpi_device")
Link: https://lore.kernel.org/linux-acpi/9f6cba7a8a57e5a687c934e8e406e28c.squirrel@mail.panix.com # [1]
Reported-by: Pierre Asselin <pa@panix.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Pierre Asselin <pa@panix.com>
2023-03-27 19:56:03 +02:00
..
acpica arm64 updates for 6.3: 2023-02-21 15:27:48 -08:00
apei ACPI: APEI: EINJ: Limit error type to 32-bit width 2023-01-30 16:40:05 +01:00
arm64
dptf
nfit ACPI: NFIT: fix a potential deadlock during NFIT teardown 2023-01-25 12:55:33 -08:00
numa dax/hmem: Move hmem device registration to dax_hmem.ko 2023-02-10 17:33:34 -08:00
pmic ACPI: PMIC: Add comments with DSDT power opregion field names 2023-01-30 16:47:13 +01:00
x86 ACPI: x86: Add skip i2c clients quirk for Lenovo Yoga Book X90 2023-03-07 14:15:10 +01:00
ac.c
acpi_adxl.c
acpi_amba.c
acpi_apd.c
acpi_cmos_rtc.c
acpi_configfs.c
acpi_dbg.c
acpi_extlog.c
acpi_ffh.c
acpi_fpdt.c
acpi_ipmi.c
acpi_lpat.c
acpi_lpit.c ACPI: Silence missing prototype warnings 2022-12-30 19:12:30 +01:00
acpi_lpss.c
acpi_memhotplug.c
acpi_pad.c
acpi_pcc.c
acpi_platform.c
acpi_pnp.c ACPI: PNP: Introduce list of known non-PNP devices 2023-01-17 12:52:11 +01:00
acpi_processor.c
acpi_tad.c
acpi_video.c ACPI: video: Don't enable fallback path for creating ACPI backlight by default 2022-12-22 17:26:42 +01:00
acpi_watchdog.c
battery.c ACPI: battery: Increase maximum string length 2023-01-30 16:43:25 +01:00
bgrt.c
blacklist.c
bus.c ACPI: bus: Rework system-level device notification handling 2023-03-27 19:56:03 +02:00
button.c
container.c
cppc_acpi.c ACPI updates for 6.3-rc1 2023-02-21 12:23:24 -08:00
custom_method.c
debugfs.c
device_pm.c PCI/ACPI: Account for _S0W of the target bridge in acpi_pci_bridge_d3() 2023-01-13 15:56:10 -06:00
device_sysfs.c Driver core changes for 6.3-rc1 2023-02-24 12:58:55 -08:00
dock.c
ec_sys.c
ec.c Merge branch 'acpi-ec' 2022-12-15 18:38:22 +01:00
event.c
evged.c
fan_attr.c
fan_core.c
fan.h
glue.c ACPI: Fix selecting wrong ACPI fwnode for the iGPU on some Dell laptops 2023-01-10 20:23:48 +01:00
hed.c
internal.h driver core: make struct device_type.uevent() take a const * 2023-01-27 13:45:36 +01:00
ioapic.c ACPI: Silence missing prototype warnings 2022-12-30 19:12:30 +01:00
irq.c
Kconfig
Makefile
nvs.c
osi.c
osl.c
pci_irq.c
pci_link.c
pci_mcfg.c
pci_root.c PCI/CXL: Export native CXL error reporting control 2023-01-05 13:31:27 -08:00
pci_slot.c
pfr_telemetry.c mm: replace vma->vm_flags direct modifications with modifier calls 2023-02-09 16:51:39 -08:00
pfr_update.c
platform_profile.c
power.c
pptt.c ACPI: PPTT: Fix to avoid sleep in the atomic context when PPTT is absent 2023-03-14 20:34:38 +01:00
prmt.c ACPI: PRM: Check whether EFI runtime is available 2023-01-18 19:58:15 +01:00
proc.c
processor_core.c
processor_driver.c ACPI: processor: Reorder acpi_processor_driver_init() 2023-03-22 15:20:38 +01:00
processor_idle.c ACPI updates for 6.3-rc1 2023-02-21 12:23:24 -08:00
processor_pdc.c
processor_perflib.c ACPI: processor: perflib: Avoid updating frequency QoS unnecessarily 2022-12-30 19:10:02 +01:00
processor_thermal.c ACPI: processor: thermal: Update CPU cooling devices on cpufreq policy changes 2023-03-22 15:20:38 +01:00
processor_throttling.c
property.c
reboot.c
resource.c ACPI: resource: Add Medion S17413 to IRQ override quirk 2023-03-24 17:07:56 +01:00
sbs.c
sbshc.c
sbshc.h
scan.c ACPI: Fix selecting wrong ACPI fwnode for the iGPU on some Dell laptops 2023-01-10 20:23:48 +01:00
sleep.c acpi: Fix suspend with Xen PV 2023-01-19 13:52:05 -08:00
sleep.h
spcr.c
sysfs.c ACPI: make kobj_type structures constant 2023-02-14 15:52:37 +01:00
tables.c ACPI: tables: Add support for NBFT 2022-12-30 18:39:09 +01:00
thermal.c
tiny-power-button.c
utils.c
video_detect.c ACPI: video: Add backlight=native DMI quirk for Acer Aspire 3830TG 2023-03-20 19:11:42 +01:00
viot.c
wakeup.c