]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
thermal: gov_step_wise: Allow cooling level to be reduced earlier
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 25 Aug 2025 13:31:53 +0000 (15:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:04 +0000 (15:34 -0500)
[ Upstream commit 2e82368359f63567862a0d438710ddffcb1ace83 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/thermal/gov_step_wise.c

index ea4bf88d37f33791297cf1f0f45148bd5f0a57dd..b038f042ed74e0f5c451bacafdb2ddf6f098f019 100644 (file)
@@ -20,7 +20,9 @@
  * If the temperature is higher than a trip point,
  *    a. if the trend is THERMAL_TREND_RAISING, use higher cooling
  *       state for this trip point
- *    b. if the trend is THERMAL_TREND_DROPPING, do nothing
+ *    b. if the trend is THERMAL_TREND_DROPPING, use a lower cooling state
+ *       for this trip point, but keep the cooling state above the applicable
+ *       minimum
  * If the temperature is lower than a trip point,
  *    a. if the trend is THERMAL_TREND_RAISING, do nothing
  *    b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
@@ -51,6 +53,17 @@ static unsigned long get_target_state(struct thermal_instance *instance,
        if (throttle) {
                if (trend == THERMAL_TREND_RAISING)
                        return clamp(cur_state + 1, instance->lower, instance->upper);
+
+               /*
+                * If the zone temperature is falling, the cooling level can
+                * be reduced, but it should still be above the lower state of
+                * the given thermal instance to pull the temperature further
+                * down.
+                */
+               if (trend == THERMAL_TREND_DROPPING)
+                       return clamp(cur_state - 1,
+                                    min(instance->lower + 1, instance->upper),
+                                    instance->upper);
        } else if (trend == THERMAL_TREND_DROPPING) {
                if (cur_state <= instance->lower)
                        return THERMAL_NO_TARGET;