Skip to content

Commit 1f74de8

Browse files
Quentin PerretIngo Molnar
authored andcommitted
sched/toplogy: Introduce the 'sched_energy_present' static key
In order to make sure Energy Aware Scheduling (EAS) will not impact systems where no Energy Model is available, introduce a static key guarding the access to EAS code. Since EAS is enabled on a per-root-domain basis, the static key is enabled when at least one root domain meets all conditions for EAS. Signed-off-by: Quentin Perret <quentin.perret@arm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: adharmap@codeaurora.org Cc: chris.redpath@arm.com Cc: currojerez@riseup.net Cc: dietmar.eggemann@arm.com Cc: edubezval@gmail.com Cc: gregkh@linuxfoundation.org Cc: javi.merino@kernel.org Cc: joel@joelfernandes.org Cc: juri.lelli@redhat.com Cc: morten.rasmussen@arm.com Cc: patrick.bellasi@arm.com Cc: pkondeti@codeaurora.org Cc: rjw@rjwysocki.net Cc: skannan@codeaurora.org Cc: smuckle@google.com Cc: srinivas.pandruvada@linux.intel.com Cc: thara.gopinath@linaro.org Cc: tkjos@google.com Cc: valentin.schneider@arm.com Cc: vincent.guittot@linaro.org Cc: viresh.kumar@linaro.org Link: https://lkml.kernel.org/r/20181203095628.11858-10-quentin.perret@arm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent 531b5c9 commit 1f74de8

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

kernel/sched/sched.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2296,3 +2296,7 @@ unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned
22962296
#else
22972297
#define perf_domain_span(pd) NULL
22982298
#endif
2299+
2300+
#ifdef CONFIG_SMP
2301+
extern struct static_key_false sched_energy_present;
2302+
#endif

kernel/sched/topology.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
201201
return 1;
202202
}
203203

204+
DEFINE_STATIC_KEY_FALSE(sched_energy_present);
204205
#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
205206
DEFINE_MUTEX(sched_energy_mutex);
206207
bool sched_energy_update;
@@ -273,6 +274,19 @@ static void destroy_perf_domain_rcu(struct rcu_head *rp)
273274
free_pd(pd);
274275
}
275276

277+
static void sched_energy_set(bool has_eas)
278+
{
279+
if (!has_eas && static_branch_unlikely(&sched_energy_present)) {
280+
if (sched_debug())
281+
pr_info("%s: stopping EAS\n", __func__);
282+
static_branch_disable_cpuslocked(&sched_energy_present);
283+
} else if (has_eas && !static_branch_unlikely(&sched_energy_present)) {
284+
if (sched_debug())
285+
pr_info("%s: starting EAS\n", __func__);
286+
static_branch_enable_cpuslocked(&sched_energy_present);
287+
}
288+
}
289+
276290
/*
277291
* EAS can be used on a root domain if it meets all the following conditions:
278292
* 1. an Energy Model (EM) is available;
@@ -299,7 +313,7 @@ static void destroy_perf_domain_rcu(struct rcu_head *rp)
299313
#define EM_MAX_COMPLEXITY 2048
300314

301315
extern struct cpufreq_governor schedutil_gov;
302-
static void build_perf_domains(const struct cpumask *cpu_map)
316+
static bool build_perf_domains(const struct cpumask *cpu_map)
303317
{
304318
int i, nr_pd = 0, nr_cs = 0, nr_cpus = cpumask_weight(cpu_map);
305319
struct perf_domain *pd = NULL, *tmp;
@@ -365,14 +379,16 @@ static void build_perf_domains(const struct cpumask *cpu_map)
365379
if (tmp)
366380
call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
367381

368-
return;
382+
return !!pd;
369383

370384
free:
371385
free_pd(pd);
372386
tmp = rd->pd;
373387
rcu_assign_pointer(rd->pd, NULL);
374388
if (tmp)
375389
call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
390+
391+
return false;
376392
}
377393
#else
378394
static void free_pd(struct perf_domain *pd) { }
@@ -2114,6 +2130,7 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,
21142130
void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
21152131
struct sched_domain_attr *dattr_new)
21162132
{
2133+
bool __maybe_unused has_eas = false;
21172134
int i, j, n;
21182135
int new_topology;
21192136

@@ -2177,14 +2194,17 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
21772194
for (i = 0; i < ndoms_new; i++) {
21782195
for (j = 0; j < n && !sched_energy_update; j++) {
21792196
if (cpumask_equal(doms_new[i], doms_cur[j]) &&
2180-
cpu_rq(cpumask_first(doms_cur[j]))->rd->pd)
2197+
cpu_rq(cpumask_first(doms_cur[j]))->rd->pd) {
2198+
has_eas = true;
21812199
goto match3;
2200+
}
21822201
}
21832202
/* No match - add perf. domains for a new rd */
2184-
build_perf_domains(doms_new[i]);
2203+
has_eas |= build_perf_domains(doms_new[i]);
21852204
match3:
21862205
;
21872206
}
2207+
sched_energy_set(has_eas);
21882208
#endif
21892209

21902210
/* Remember the new sched domains: */

0 commit comments

Comments
 (0)