[PATCH 2/2] sched/cpufreq: Update schedutil's DVFS request to reach the boost frequencies

Sibi Sankar <[email protected]>
Newsgroups org.kernel.vger.linux-pm,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
capacity_freq_ref, exposed to schedutil via get_capacity_ref_freq(),
was introduced by commit 9942cb22ea45 ("sched/topology: Add a new
arch_scale_freq_ref() method") as a fixed anchor that does not move at
runtime. However, schedutil uses that same fixed anchor as the reference
plugged into map_util_freq() which saturates exactly at capacity_freq_ref.

As a result, a system with cpufreq boost enabled effectively never runs at
boost frequencies under schedutil-governed load. Fix this by plugging in
policy-max into the map_util_freq equation, so that the DVFS requests
translates to the actual cpufreq driver ceiling.

Signed-off-by: Sibi Sankar <[email protected]>
---
 kernel/sched/cpufreq_schedutil.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index a1782755efcc..dcefbeaa0702 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -195,10 +195,17 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
 				  unsigned long util, unsigned long max)
 {
 	struct cpufreq_policy *policy = sg_policy->policy;
-	unsigned int freq;
+	unsigned int freq, ref;
 
-	freq = get_capacity_ref_freq(policy);
-	freq = map_util_freq(util, freq, max);
+	ref = get_capacity_ref_freq(policy);
+
+	/*
+	 * That fixed anchor governs how utilization is interpreted, but
+	 * the DVFS request is free to target the current policy ceiling.
+	 * Using ref alone would saturate the util->freq map at ref so
+	 * use policy->max to reach boost frequencies.
+	 */
+	freq = map_util_freq(util, max(ref, READ_ONCE(policy->max)), max);
 
 	if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update)
 		return sg_policy->next_freq;
-- 
2.34.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.