mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-03 17:40:04 +00:00
thermal_sys: check get_temp return value
The return value of the get_temp function is not checked when doing a thermal zone update. This may lead to a critical shutdown if get_temp fails and the content of the temp variable is incorrectly set higher than the critical trip point. This has been observed on a system with incorrect ACPI implementation where the corresponding methods were not serialized and therefore sometimes triggered ACPI errors (AE_ALREADY_EXISTS). The following critical shutdowns indicated a temperature of 2097 C, which was obviously wrong. The patch adds a return value check that jumps over all trip point evaluations printing a warning if get_temp fails. The trip points are evaluated again on the next polling interval with successful get_temp execution. Signed-off-by: Michael Brunner <mibru@gmx.de> Acked-by: Zhang Rui <rui.zhang@intel.com> Cc: Len Brown <lenb@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4ab6c08336
commit
0d288162f2
1 changed files with 8 additions and 1 deletions
|
@ -953,7 +953,12 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
|
||||||
|
|
||||||
mutex_lock(&tz->lock);
|
mutex_lock(&tz->lock);
|
||||||
|
|
||||||
tz->ops->get_temp(tz, &temp);
|
if (tz->ops->get_temp(tz, &temp)) {
|
||||||
|
/* get_temp failed - retry it later */
|
||||||
|
printk(KERN_WARNING PREFIX "failed to read out thermal zone "
|
||||||
|
"%d\n", tz->id);
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
for (count = 0; count < tz->trips; count++) {
|
for (count = 0; count < tz->trips; count++) {
|
||||||
tz->ops->get_trip_type(tz, count, &trip_type);
|
tz->ops->get_trip_type(tz, count, &trip_type);
|
||||||
|
@ -1005,6 +1010,8 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
|
||||||
THERMAL_TRIPS_NONE);
|
THERMAL_TRIPS_NONE);
|
||||||
|
|
||||||
tz->last_temperature = temp;
|
tz->last_temperature = temp;
|
||||||
|
|
||||||
|
leave:
|
||||||
if (tz->passive)
|
if (tz->passive)
|
||||||
thermal_zone_device_set_polling(tz, tz->passive_delay);
|
thermal_zone_device_set_polling(tz, tz->passive_delay);
|
||||||
else if (tz->polling_delay)
|
else if (tz->polling_delay)
|
||||||
|
|
Loading…
Reference in a new issue