OpenCloudOS-Kernel/drivers/thermal
Rafael J. Wysocki fcecef9a84 thermal: core: Fix thermal zone suspend-resume synchronization
[ Upstream commit 4e814173a8c4f432fd068b1c796f0416328c9d99 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-02-05 20:14:15 +00:00
..
broadcom thermal/drivers/broadcom/brcstb_thermal: Removed unneeded platform_set_drvdata() 2023-08-16 12:22:28 +02:00
intel thermal: intel: hfi: Add syscore callbacks for system-wide PM 2024-01-31 16:19:09 -08:00
mediatek thermal/drivers/mediatek: Fix probe for THERMAL_V2 2023-11-20 11:59:01 +01:00
qcom thermal/drivers/tsens: Make tsens_xxxx_nvmem static 2023-08-16 09:54:39 +02:00
samsung thermal/drivers/samsung: Fix Wvoid-pointer-to-enum-cast warning 2023-08-16 12:11:19 +02:00
st thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
tegra thermal/drivers/tegra-bpmp: Check if BPMP supports trip points 2023-08-22 19:10:28 +02:00
ti-soc-thermal thermal: Constify the trip argument of the .get_trend() zone callback 2023-09-11 17:16:40 +02:00
Kconfig 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
amlogic_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
armada_thermal.c thermal: Use thermal_tripless_zone_device_register() 2023-09-05 21:42:18 +02:00
cpufreq_cooling.c - Add more thermal zone device encapsulation: prevent setting 2023-04-03 20:43:32 +02:00
cpuidle_cooling.c More thermal control updates for 6.4-rc1 2023-05-03 11:46:01 -07:00
da9062-thermal.c thermal/drivers/da9062: Don't access the thermal zone device fields 2023-03-03 20:45:03 +01: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: Use thermal_tripless_zone_device_register() 2023-09-05 21:42:18 +02:00
gov_bang_bang.c thermal: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
gov_fair_share.c thermal: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
gov_power_allocator.c thermal: gov_power_allocator: avoid inability to reset a cdev 2024-01-31 16:19:10 -08:00
gov_step_wise.c thermal: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
gov_user_space.c thermal: gov_user_space: Do not lock thermal zone mutex 2022-08-30 20:18:47 +02:00
hisi_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
imx8mm_thermal.c thermal/drivers/imx8mm: Suppress log message on probe deferral 2023-08-16 09:54:39 +02:00
imx_sc_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
imx_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
k3_bandgap.c thermal/drivers/k3_bandgap: Remove unneeded call to platform_set_drvdata() 2023-08-16 12:19:28 +02:00
k3_j72xx_bandgap.c thermal/drivers/k3_j72xx_bandgap: Removed unneeded call to platform_set_drvdata() 2023-08-16 12:18:02 +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: Use thermal_tripless_zone_device_register() 2023-09-05 21:42:18 +02:00
loongson2_thermal.c drivers/thermal/loongson2_thermal: Fix incorrect PTR_ERR() judgment 2024-01-25 15:35:15 -08:00
max77620_thermal.c thermal/drivers/max77620_thermal: Removed unneeded call to platform_set_drvdata() 2023-08-16 12:33:53 +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: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
rcar_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
rockchip_thermal.c thermal/drivers/rockchip: use devm_reset_control_array_get_exclusive() 2023-04-07 10:31:33 +02:00
rzg2l_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00
spear_thermal.c thermal: Use thermal_tripless_zone_device_register() 2023-09-05 21:42:18 +02:00
sprd_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +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-generic-adc.c thermal/drivers/generic-adc: Removed unneeded call to platform_set_drvdata() 2023-08-16 12:36:21 +02:00
thermal_acpi.c thermal: ACPI: Make helpers retrieve temperature only 2023-02-02 15:26:45 +01:00
thermal_core.c thermal: core: Fix thermal zone suspend-resume synchronization 2024-02-05 20:14:15 +00:00
thermal_core.h thermal: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
thermal_helpers.c thermal: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
thermal_hwmon.c thermal/hwmon: Add error information printing for devm_thermal_add_hwmon_sysfs() 2023-06-26 12:03:14 +02: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/core: Fix unregistering netlink at thermal init time 2023-01-25 16:40:39 +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: core: Store trip pointer in struct thermal_instance 2024-01-31 16:19:10 -08:00
thermal_trace.h thermal/core: Relocate the traces definition in thermal directory 2023-04-01 20:51:45 +02:00
thermal_trace_ipa.h thermal/core: Relocate the traces definition in thermal directory 2023-04-01 20:51:45 +02:00
thermal_trip.c thermal: trip: Drop lockdep assertion from thermal_zone_trip_id() 2024-01-31 16:19:14 -08:00
uniphier_thermal.c thermal: Explicitly include correct DT includes 2023-07-31 20:03:42 +02:00