]> Git Repo - J-linux.git/commitdiff
sched/fair: Fix frequency selection for non-invariant case
authorVincent Guittot <[email protected]>
Sun, 14 Jan 2024 18:36:00 +0000 (19:36 +0100)
committerIngo Molnar <[email protected]>
Tue, 16 Jan 2024 09:41:25 +0000 (10:41 +0100)
Linus reported a ~50% performance regression on single-threaded
workloads on his AMD Ryzen system, and bisected it to:

  9c0b4bb7f630 ("sched/cpufreq: Rework schedutil governor performance estimation")

When frequency invariance is not enabled, get_capacity_ref_freq(policy)
is supposed to return the current frequency and the performance margin
applied by map_util_perf(), enabling the utilization to go above the
maximum compute capacity and to select a higher frequency than the current one.

After the changes in 9c0b4bb7f630, the performance margin was applied
earlier in the path to take into account utilization clampings and
we couldn't get a utilization higher than the maximum compute capacity,
and the CPU remained 'stuck' at lower frequencies.

To fix this, we must use a frequency above the current frequency to
get a chance to select a higher OPP when the current one becomes fully used.
Apply the same margin and return a frequency 25% higher than the current
one in order to switch to the next OPP before we fully use the CPU
at the current one.

[ mingo: Clarified the changelog. ]

Fixes: 9c0b4bb7f630 ("sched/cpufreq: Rework schedutil governor performance estimation")
Reported-by: Linus Torvalds <[email protected]>
Bisected-by: Linus Torvalds <[email protected]>
Reported-by: Wyes Karny <[email protected]>
Signed-off-by: Vincent Guittot <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
Tested-by: Wyes Karny <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
kernel/sched/cpufreq_schedutil.c

index 95c3c097083e505f41931168cef46f84cf4fac52..eece6244f9d2fea301f5523ef1d7d6779f0d4625 100644 (file)
@@ -133,7 +133,11 @@ unsigned long get_capacity_ref_freq(struct cpufreq_policy *policy)
        if (arch_scale_freq_invariant())
                return policy->cpuinfo.max_freq;
 
-       return policy->cur;
+       /*
+        * Apply a 25% margin so that we select a higher frequency than
+        * the current one before the CPU is fully busy:
+        */
+       return policy->cur + (policy->cur >> 2);
 }
 
 /**
This page took 0.053252 seconds and 4 git commands to generate.