Re: [PATCH] cpufreq: conservative: Fix incorrect frequency decrease due to stale target

From: Stratos Karafotis

Date: Wed Apr 22 2026 - 04:17:30 EST


Hi all!

I was struggling to see your point, but I think you are right.

The requested_freq could be equal to policy->min (due to idle periods)
while the dbs_info->requested_freq could be greater than policy->min.
So, in this case it breaks out early without the chance to further reduce the frequency, correct?

Stratos Karafotis

On 4/21/26 15:35, Lifeng Zheng wrote:
In cs_dbs_update(), the requested frequency is decremented by one freq_step
for each idle period. However, this can cause divergence between
'requested_freq' (target for current update) and 'dbs_info->requested_freq'
(target from previous update).

When the load crosses up_threshold or down_threshold, the decision on
whether to increase or decrease frequency should be based on the *previous*
target (dbs_info->requested_freq), not the current one. Otherwise, the
update step may be skipped entirely if the current target has already hit a
boundary due to prior adjustments.

Ensure that frequency scaling decisions are made using the correct
historical target, fixing cases where frequency fails to decrease despite
sustained idle periods.

Fixes: 00bfe05889e9 ("cpufreq: conservative: Decrease frequency faster for deferred updates")
Signed-off-by: Lifeng Zheng <zhenglifeng1@xxxxxxxxxx>
---
drivers/cpufreq/cpufreq_conservative.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index df01d33993d8..f3c3b54e4bf8 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -104,7 +104,7 @@ static unsigned int cs_dbs_update(struct cpufreq_policy *policy)
dbs_info->down_skip = 0;
/* if we are already at full speed then break out early */
- if (requested_freq == policy->max)
+ if (dbs_info->requested_freq == policy->max)
goto out;
requested_freq += freq_step;
@@ -127,7 +127,7 @@ static unsigned int cs_dbs_update(struct cpufreq_policy *policy)
/*
* if we cannot reduce the frequency anymore, break out early
*/
- if (requested_freq == policy->min)
+ if (dbs_info->requested_freq == policy->min)
goto out;
if (requested_freq > freq_step)