ANDROID: sched/tune: Move SchedTune cpu API into UtilClamp wrappers

The SchedTune CPU boosting API is currently used from sugov_get_util()
to get the boosted utilization and to pass it into schedutil_cpu_util().

When UtilClamp is in use instead we call schedutil_cpu_util() by
passing in just the CFS utilization and the clamping is done internally
on the aggregated CFS+RT utilization for FREQUENCY_UTIL calls.

This asymmetry is not required moreover, schedutil code is polluted by
non-mainline SchedTune code.

Wrap SchedTune API call related to cpu utilization boosting with a more
generic and mainlinish UtilClamp call:

 - uclamp_rq_util_with(cpu, util, p)  <= boosted_cpu_util(cpu)

This new API is already used in schedutil_cpu_util() to clamp the
aggregated RT+CFS utilization on FREQUENCY_UTIL calls.

Move the cpu boosting into uclamp_rq_util_with() so that we remove any
SchedTune specific bit from kernel/sched/cpufreq_schedutil.c.

Get rid of the no more required boosted_cpu_util(cpu) method and replace
it with a stune_util(cpu, util) which signature is better aligned with
its uclamp_rq_util_with(cpu, util, p) counterpart.

Bug: 120440300
Signed-off-by: Patrick Bellasi <patrick.bellasi@arm.com>
Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Change-Id: I45b0f0f54123fe0a2515fa9f1683842e6b99234f
[Removed superfluous __maybe_unused for capacity_orig_of]
Signed-off-by: Quentin Perret <qperret@google.com>
This commit is contained in:
Patrick Bellasi
2019-04-04 10:24:43 +01:00
committed by Quentin Perret
parent 777da39ce1
commit 9a05300da0
5 changed files with 20 additions and 8 deletions

View File

@@ -233,9 +233,9 @@ Thus, with the sched_cfs_boost enabled we have the following main functions to
get the current utilization of a CPU: get the current utilization of a CPU:
cpu_util() cpu_util()
boosted_cpu_util() stune_util()
The new boosted_cpu_util() is similar to the first but returns a boosted The new stune_util() is similar to the first but returns a boosted
utilization signal which is a function of the sched_cfs_boost value. utilization signal which is a function of the sched_cfs_boost value.
This function is used in the CFS scheduler code paths where schedutil needs to This function is used in the CFS scheduler code paths where schedutil needs to

View File

@@ -326,13 +326,19 @@ unsigned long schedutil_cpu_util(int cpu, unsigned long util_cfs,
static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu) static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu)
{ {
struct rq *rq = cpu_rq(sg_cpu->cpu); struct rq *rq = cpu_rq(sg_cpu->cpu);
unsigned long util = boosted_cpu_util(sg_cpu->cpu, cpu_util_rt(rq)); #ifdef CONFIG_SCHED_TUNE
unsigned long util = stune_util(sg_cpu->cpu, cpu_util_rt(rq));
#else
unsigned long util = cpu_util_freq(sg_cpu->cpu);
#endif
unsigned long util_cfs = util - cpu_util_rt(rq);
unsigned long max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu); unsigned long max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu);
sg_cpu->max = max; sg_cpu->max = max;
sg_cpu->bw_dl = cpu_bw_dl(rq); sg_cpu->bw_dl = cpu_bw_dl(rq);
return schedutil_cpu_util(sg_cpu->cpu, util, max, FREQUENCY_UTIL, NULL); return schedutil_cpu_util(sg_cpu->cpu, util_cfs, max,
FREQUENCY_UTIL, NULL);
} }
/** /**

View File

@@ -5868,7 +5868,7 @@ schedtune_task_margin(struct task_struct *task)
} }
unsigned long unsigned long
boosted_cpu_util(int cpu, unsigned long other_util) stune_util(int cpu, unsigned long other_util)
{ {
unsigned long util = min_t(unsigned long, SCHED_CAPACITY_SCALE, unsigned long util = min_t(unsigned long, SCHED_CAPACITY_SCALE,
cpu_util_cfs(cpu_rq(cpu)) + other_util); cpu_util_cfs(cpu_rq(cpu)) + other_util);

View File

@@ -2416,6 +2416,14 @@ static inline unsigned long cpu_util_rt(struct rq *rq)
{ {
return READ_ONCE(rq->avg_rt.util_avg); return READ_ONCE(rq->avg_rt.util_avg);
} }
static inline unsigned long cpu_util_freq(int cpu)
{
struct rq *rq = cpu_rq(cpu);
return min(cpu_util_cfs(rq) + cpu_util_rt(rq), capacity_orig_of(cpu));
}
#else /* CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ #else /* CONFIG_CPU_FREQ_GOV_SCHEDUTIL */
static inline unsigned long schedutil_cpu_util(int cpu, unsigned long util_cfs, static inline unsigned long schedutil_cpu_util(int cpu, unsigned long util_cfs,
unsigned long max, enum schedutil_type type, unsigned long max, enum schedutil_type type,

View File

@@ -20,7 +20,7 @@ int schedtune_prefer_idle(struct task_struct *tsk);
void schedtune_enqueue_task(struct task_struct *p, int cpu); void schedtune_enqueue_task(struct task_struct *p, int cpu);
void schedtune_dequeue_task(struct task_struct *p, int cpu); void schedtune_dequeue_task(struct task_struct *p, int cpu);
unsigned long boosted_cpu_util(int cpu, unsigned long other_util); unsigned long stune_util(int cpu, unsigned long other_util);
#else /* CONFIG_SCHED_TUNE */ #else /* CONFIG_SCHED_TUNE */
@@ -32,6 +32,4 @@ unsigned long boosted_cpu_util(int cpu, unsigned long other_util);
#define schedtune_enqueue_task(task, cpu) do { } while (0) #define schedtune_enqueue_task(task, cpu) do { } while (0)
#define schedtune_dequeue_task(task, cpu) do { } while (0) #define schedtune_dequeue_task(task, cpu) do { } while (0)
#define boosted_cpu_util(cpu, other_util) cpu_util_cfs(cpu_rq(cpu))
#endif /* CONFIG_SCHED_TUNE */ #endif /* CONFIG_SCHED_TUNE */