Skip to content

Commit

Permalink
sched/cpufreq: Split utilization signals
Browse files Browse the repository at this point in the history
To be able to treat utilization signals of different scheduling classes
in different ways (e.g., CFS signal might be stale while DEADLINE signal
is never stale by design) we need to split sugov_cpu::util signal in two:
util_cfs and util_dl.

This patch does that by also changing sugov_get_util() parameter list.
After this change, aggregation of the different signals has to be performed
by sugov_get_util() users (so that they can decide what to do with the
different signals).

Suggested-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Juri Lelli <juri.lelli@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Claudio Scordino <claudio@evidence.eu.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luca Abeni <luca.abeni@santannapisa.it>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: alessio.balsini@arm.com
Cc: bristot@redhat.com
Cc: dietmar.eggemann@arm.com
Cc: joelaf@google.com
Cc: juri.lelli@redhat.com
Cc: mathieu.poirier@linaro.org
Cc: morten.rasmussen@arm.com
Cc: patrick.bellasi@arm.com
Cc: rjw@rjwysocki.net
Cc: rostedt@goodmis.org
Cc: tkjos@android.com
Cc: tommaso.cucinotta@santannapisa.it
Cc: vincent.guittot@linaro.org
Link: http://lkml.kernel.org/r/20171204102325.5110-5-juri.lelli@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Juri Lelli authored and Ingo Molnar committed Jan 10, 2018
1 parent 794a56e commit d18be45
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions kernel/sched/cpufreq_schedutil.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ struct sugov_cpu {
u64 last_update;

/* The fields below are only needed when sharing a policy. */
unsigned long util;
unsigned long util_cfs;
unsigned long util_dl;
unsigned long max;
unsigned int flags;

Expand Down Expand Up @@ -176,20 +177,23 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
return cpufreq_driver_resolve_freq(policy, freq);
}

static void sugov_get_util(unsigned long *util, unsigned long *max, int cpu)
static void sugov_get_util(struct sugov_cpu *sg_cpu)
{
struct rq *rq = cpu_rq(cpu);
unsigned long util_cfs = cpu_util_cfs(rq);
unsigned long util_dl = cpu_util_dl(rq);
struct rq *rq = cpu_rq(sg_cpu->cpu);

*max = arch_scale_cpu_capacity(NULL, cpu);
sg_cpu->max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu);
sg_cpu->util_cfs = cpu_util_cfs(rq);
sg_cpu->util_dl = cpu_util_dl(rq);
}

static unsigned long sugov_aggregate_util(struct sugov_cpu *sg_cpu)
{
/*
* Ideally we would like to set util_dl as min/guaranteed freq and
* util_cfs + util_dl as requested freq. However, cpufreq is not yet
* ready for such an interface. So, we only do the latter for now.
*/
*util = min(util_cfs + util_dl, *max);
return min(sg_cpu->util_cfs + sg_cpu->util_dl, sg_cpu->max);
}

static void sugov_set_iowait_boost(struct sugov_cpu *sg_cpu, u64 time)
Expand Down Expand Up @@ -279,7 +283,9 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
if (flags & SCHED_CPUFREQ_RT) {
next_f = policy->cpuinfo.max_freq;
} else {
sugov_get_util(&util, &max, sg_cpu->cpu);
sugov_get_util(sg_cpu);
max = sg_cpu->max;
util = sugov_aggregate_util(sg_cpu);
sugov_iowait_boost(sg_cpu, &util, &max);
next_f = get_next_freq(sg_policy, util, max);
/*
Expand Down Expand Up @@ -324,8 +330,8 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time)
if (j_sg_cpu->flags & SCHED_CPUFREQ_RT)
return policy->cpuinfo.max_freq;

j_util = j_sg_cpu->util;
j_max = j_sg_cpu->max;
j_util = sugov_aggregate_util(j_sg_cpu);
if (j_util * max > j_max * util) {
util = j_util;
max = j_max;
Expand All @@ -342,15 +348,11 @@ static void sugov_update_shared(struct update_util_data *hook, u64 time,
{
struct sugov_cpu *sg_cpu = container_of(hook, struct sugov_cpu, update_util);
struct sugov_policy *sg_policy = sg_cpu->sg_policy;
unsigned long util, max;
unsigned int next_f;

sugov_get_util(&util, &max, sg_cpu->cpu);

raw_spin_lock(&sg_policy->update_lock);

sg_cpu->util = util;
sg_cpu->max = max;
sugov_get_util(sg_cpu);
sg_cpu->flags = flags;

sugov_set_iowait_boost(sg_cpu, time);
Expand Down

0 comments on commit d18be45

Please sign in to comment.