linux-next/drivers/thermal
Rafael J. Wysocki 4e814173a8 thermal: core: Fix thermal zone suspend-resume synchronization
There are 3 synchronization issues with thermal zone suspend-resume
during system-wide transitions:

 1. The resume code runs in a PM notifier which is invoked after user
    space has been thawed, so it can run concurrently with user space
    which can trigger a thermal zone device removal.  If that happens,
    the thermal zone resume code may use a stale pointer to the next
    list element and crash, because it does not hold thermal_list_lock
    while walking thermal_tz_list.

 2. The thermal zone resume code calls thermal_zone_device_init()
    outside the zone lock, so user space or an update triggered by
    the platform firmware may see an inconsistent state of a
    thermal zone leading to unexpected behavior.

 3. Clearing the in_suspend global variable in thermal_pm_notify()
    allows __thermal_zone_device_update() to continue for all thermal
    zones and it may as well run before the thermal_tz_list walk (or
    at any point during the list walk for that matter) and attempt to
    operate on a thermal zone that has not been resumed yet.  It may
    also race destructively with thermal_zone_device_init().

To address these issues, add thermal_list_lock locking to
thermal_pm_notify(), especially arount the thermal_tz_list,
make it call thermal_zone_device_init() back-to-back with
__thermal_zone_device_update() under the zone lock and replace
in_suspend with per-zone bool "suspend" indicators set and unset
under the given zone's lock.

Link: https://lore.kernel.org/linux-pm/20231218162348.69101-1-bo.ye@mediatek.com/
Reported-by: Bo Ye <bo.ye@mediatek.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2023-12-28 14:20:15 +01:00
..
broadcom thermal: ns: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
intel thermal: trip: Send trip change notifications on all trip updates 2023-12-13 12:37:01 +01:00
mediatek thermal/drivers/mediatek/lvts_thermal: Update calibration data documentation 2023-10-19 02:43:32 +02:00
qcom Thermal control updates for 6.7-rc1 2023-10-31 15:28:37 -10:00
samsung thermal: exynos_tmu: Convert to platform remove callback returning void 2023-10-02 14:24:02 +02:00
st thermal: stm: Convert to platform remove callback returning void 2023-10-02 14:24:09 +02:00
tegra thermal: tegra-bpmp: Convert to platform remove callback returning void 2023-10-02 14:24:13 +02:00
ti-soc-thermal thermal: ti-bandgap: Convert to platform remove callback returning void 2023-10-02 14:24:15 +02:00
amlogic_thermal.c thermal: amlogic: Convert to platform remove callback returning void 2023-10-02 14:24:19 +02:00
armada_thermal.c thermal: armada: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
cpufreq_cooling.c - Add more thermal zone device encapsulation: prevent setting 2023-04-03 20:43:32 +02:00
cpuidle_cooling.c thermal: cpuidle_cooling: fix kernel-doc warning and a spello 2023-12-21 12:05:48 +01:00
da9062-thermal.c thermal: da9062: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
db8500_thermal.c thermal/drivers/db8500: Remove redundant of_match_ptr() 2023-08-16 12:09:19 +02:00
devfreq_cooling.c thermal/core: Relocate the traces definition in thermal directory 2023-04-01 20:51:45 +02:00
dove_thermal.c thermal: dove: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
gov_bang_bang.c thermal: core: Pass trip pointer to governor throttle callback 2023-10-20 19:26:37 +02:00
gov_fair_share.c thermal: core: Pass trip pointer to governor throttle callback 2023-10-20 19:26:37 +02:00
gov_power_allocator.c thermal: gov_power_allocator: Rearrange initialization of local variables 2023-11-28 16:02:14 +01:00
gov_step_wise.c thermal: core: Pass trip pointer to governor throttle callback 2023-10-20 19:26:37 +02:00
gov_user_space.c thermal: core: Pass trip pointer to governor throttle callback 2023-10-20 19:26:37 +02:00
hisi_thermal.c thermal: hisi: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
imx8mm_thermal.c thermal/drivers/imx8mm_thermal: Fix function pointer declaration by adding identifier name 2023-10-15 23:40:09 +02:00
imx_sc_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
imx_thermal.c thermal: imx: Convert to platform remove callback returning void 2023-09-29 12:34:16 +02:00
k3_bandgap.c thermal: k3_bandgap: Convert to platform remove callback returning void 2023-09-29 12:34:17 +02:00
k3_j72xx_bandgap.c thermal: k3_j72xx_bandgap: Convert to platform remove callback returning void 2023-09-29 12:34:17 +02:00
Kconfig thermal/drivers/loongson-2: Add thermal management support 2023-08-17 09:27:18 +02:00
khadas_mcu_fan.c thermal/core: Make cooling device state change private 2021-01-19 22:31:10 +01:00
kirkwood_thermal.c thermal: kirkwood: Convert to platform remove callback returning void 2023-09-29 12:34:17 +02:00
loongson2_thermal.c thermal/drivers/loongson-2: Add thermal management support 2023-08-17 09:27:18 +02:00
Makefile thermal/drivers/loongson-2: Add thermal management support 2023-08-17 09:27:18 +02:00
max77620_thermal.c thermal/drivers/max77620: Remove duplicate error message 2023-10-15 23:40:10 +02:00
qoriq_thermal.c thermal/drivers/qoriq: Remove redundant msg in qoriq_tmu_register_tmu_zone() 2023-06-26 12:03:14 +02:00
rcar_gen3_thermal.c thermal: rcar_gen3: Convert to platform remove callback returning void 2023-09-29 12:34:17 +02:00
rcar_thermal.c thermal: rcar: Convert to platform remove callback returning void 2023-09-29 12:34:17 +02:00
rockchip_thermal.c thermal: rockchip: Convert to platform remove callback returning void 2023-10-02 14:23:30 +02:00
rzg2l_thermal.c thermal: rzg2l: Convert to platform remove callback returning void 2023-10-02 14:23:51 +02:00
spear_thermal.c thermal: spear: Convert to platform remove callback returning void 2023-10-02 14:24:06 +02:00
sprd_thermal.c thermal: sprd: Convert to platform remove callback returning void 2023-10-02 14:24:08 +02:00
sun8i_thermal.c thermal/drivers/sun8i_thermal: Remove unneeded call to platform_set_drvdata() 2023-08-16 12:31:22 +02:00
thermal_acpi.c thermal: ACPI: Include the right header file 2023-10-20 19:26:37 +02:00
thermal_core.c thermal: core: Fix thermal zone suspend-resume synchronization 2023-12-28 14:20:15 +01:00
thermal_core.h thermal: trip: Drop redundant __thermal_zone_get_trip() header 2023-12-13 12:31:59 +01:00
thermal_helpers.c thermal: helpers: Use for_each_trip() in __thermal_zone_get_temp() 2023-12-13 12:33:43 +01:00
thermal_hwmon.c thermal: Drop redundant and confusing device_is_registered() checks 2023-12-12 13:00:28 +01:00
thermal_hwmon.h thermal/hwmon: Use the right device for devm_thermal_add_hwmon_sysfs() 2023-03-03 20:45:02 +01:00
thermal_mmio.c thermal/core: Use the thermal zone 'devdata' accessor in thermal located drivers 2023-03-03 20:45:02 +01:00
thermal_netlink.c thermal: netlink: Use for_each_trip() in thermal_genl_cmd_tz_get_trip() 2023-12-13 12:33:43 +01:00
thermal_netlink.h thermal/core: Fix unregistering netlink at thermal init time 2023-01-25 16:40:39 +01:00
thermal_of.c thermal/of: add missing of_node_put() 2023-09-11 17:16:36 +02:00
thermal_sysfs.c thermal: trip: Send trip change notifications on all trip updates 2023-12-13 12:37:01 +01:00
thermal_trace_ipa.h thermal/core: Relocate the traces definition in thermal directory 2023-04-01 20:51:45 +02:00
thermal_trace.h thermal/core: Relocate the traces definition in thermal directory 2023-04-01 20:51:45 +02:00
thermal_trip.c thermal: trip: Send trip change notifications on all trip updates 2023-12-13 12:37:01 +01:00
thermal-generic-adc.c thermal/drivers/generic-adc: Removed unneeded call to platform_set_drvdata() 2023-08-16 12:36:21 +02:00
uniphier_thermal.c thermal: uniphier: Convert to platform remove callback returning void 2023-10-02 14:24:17 +02:00