Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

thermal: gov_step_wise: Allow cooling level to be reduced earlier

The current behavior of the Step-wise thermal governor is to increase
the cooling level one step at a time after trip point threshold passing
by thermal zone temperature until the temperature stops to rise. Then,
nothing is done until the temperature decreases below the (possibly
updated) trip point threshold, at which point the cooling level is
reduced straight to the applicable minimum.

While this generally works, it is not in agreement with the throttling
logic description comment in step_wise_manage() any more after some
relatively recent changes, and in the case of passive cooling, it may
lead to undesirable performance oscillations between high and low
levels.

For this reason, modify the governor's cooling device state selection
function, get_target_state(), to reduce cooling by one level even if
the temperature is still above the thermal zone threshold, but the
temperature has started to fall down. However, ensure that the cooling
level will remain above the applicable minimum in that case to pull
the zone temperature further down, possibly until it falls below the
trip threshold (which may now be equal to the low temperature of the
trip).

Doing so should help higher performance to be restored earlier in some
cases which is desirable especially for passive trip points with
relatively high hysteresis values.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Link: https://patch.msgid.link/1947735.tdWV9SEqCh@rafael.j.wysocki
[ rjw: Changelog edits ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

+14 -1
+14 -1
drivers/thermal/gov_step_wise.c
··· 20 20 * If the temperature is higher than a trip point, 21 21 * a. if the trend is THERMAL_TREND_RAISING, use higher cooling 22 22 * state for this trip point 23 - * b. if the trend is THERMAL_TREND_DROPPING, do nothing 23 + * b. if the trend is THERMAL_TREND_DROPPING, use a lower cooling state 24 + * for this trip point, but keep the cooling state above the applicable 25 + * minimum 24 26 * If the temperature is lower than a trip point, 25 27 * a. if the trend is THERMAL_TREND_RAISING, do nothing 26 28 * b. if the trend is THERMAL_TREND_DROPPING, use the minimum applicable ··· 53 51 if (throttle) { 54 52 if (trend == THERMAL_TREND_RAISING) 55 53 return clamp(cur_state + 1, instance->lower, instance->upper); 54 + 55 + /* 56 + * If the zone temperature is falling, the cooling level can 57 + * be reduced, but it should still be above the lower state of 58 + * the given thermal instance to pull the temperature further 59 + * down. 60 + */ 61 + if (trend == THERMAL_TREND_DROPPING) 62 + return clamp(cur_state - 1, 63 + min(instance->lower + 1, instance->upper), 64 + instance->upper); 56 65 } else if (trend == THERMAL_TREND_DROPPING) { 57 66 if (cur_state <= instance->lower) 58 67 return THERMAL_NO_TARGET;