Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit b684682

Browse files
committed
thermal: gov_step_wise: Restore passive polling management
Consider a thermal zone with one passive trip point, a cooling device with 3 states (0, 1, 2) bound to it, passive polling enabled (nonzero passive_delay_jiffies) and no regular polling (polling_delay_jiffies equal to 0) that is managed by the Step-Wise governor. Suppose that the initial state of the cooling device is 0 and the zone temperature is below the trip point to start with. When the trip point is crossed, tz->passive is incremented by the thermal core and the governor's .manage() callback is invoked. It sets 'throttle' to 'true' for the trip in question and get_target_state() returns 1 for the instance corresponding to the cooling device (say that 'upper' and 'lower' are set to 2 and 0 for it, respectively), so its state changes to 1. Passive polling is still active for the zone, so next time the temperature is updated, the governor's .manage() callback will be invoked again. If the temperature is still rising, it will change the state of the cooling device to 2. Now suppose that next time the zone temperature is updated, it falls below the trip point, so tz->passive is decremented for the zone (say it becomes 0 then) and the governor's .manage() callbacks runs. It finds that the temperature trend for the zone is 'falling' and 'throttle' will be set to 'false' for the trip in question, so the cooling device's state will be changed to 1. However, because tz->polling is 0 for the zone, the governor's .manage() callback may not be invoked again for a long time and the cooling device's state will not be reset back to 0. This can happen because commit 042a3d8 ("thermal: core: Move passive polling management to the core") removed passive polling management from the Step-Wise governor. Before that change, thermal_zone_trip_update() would bump up tz->passive when changing the target state for a thermal instance from "no target" to a specific value and it would drop tz->passive when changing it back to "no target" which would cause passive polling to be active for the zone until the governor has reset the states of all cooling devices. In particular, in the example above tz->passive would be incremented when changing the state of the cooling device from 0 to 1 and then it would be still nonzero when the state of the cooling device was changed from 2 to 1. To prevent this problem from occurring, restore the passive polling management in the Step-Wise governor by partially reverting the commit in question and update the comment in the restored code to explain its role more clearly. Fixes: 042a3d8 ("thermal: core: Move passive polling management to the core") Closes: https://lore.kernel.org/linux-pm/ZmVfcEOxmjUHZTSX@hovoldconsulting.com Reported-by: Johan Hovold <johan+linaro@kernel.org> Tested-by: Johan Hovold <johan+linaro@kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent 7f18bd4 commit b684682

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

drivers/thermal/gov_step_wise.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,23 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
9393
if (instance->initialized && old_target == instance->target)
9494
continue;
9595

96+
if (trip->type == THERMAL_TRIP_PASSIVE) {
97+
/*
98+
* If the target state for this thermal instance
99+
* changes from THERMAL_NO_TARGET to something else,
100+
* ensure that the zone temperature will be updated
101+
* (assuming enabled passive cooling) until it becomes
102+
* THERMAL_NO_TARGET again, or the cooling device may
103+
* not be reset to its initial state.
104+
*/
105+
if (old_target == THERMAL_NO_TARGET &&
106+
instance->target != THERMAL_NO_TARGET)
107+
tz->passive++;
108+
else if (old_target != THERMAL_NO_TARGET &&
109+
instance->target == THERMAL_NO_TARGET)
110+
tz->passive--;
111+
}
112+
96113
instance->initialized = true;
97114

98115
mutex_lock(&instance->cdev->lock);

0 commit comments

Comments
 (0)