diff options
| author | Morten Rasmussen <morten.rasmussen@arm.com> | 2017-02-06 16:28:53 +0000 |
|---|---|---|
| committer | Andres Oportus <andresoportus@google.com> | 2017-06-02 08:01:55 -0700 |
| commit | fc969e3bfa7aaaee77d91c55807ee5a8c6a26b73 (patch) | |
| tree | 4cab6bc6d8ad9c4f02155ef6b1dd8a40072ae0f4 /kernel | |
| parent | fef0112a63989830cfd60f6ede53014600e751e0 (diff) | |
sched/fair: Fix sched_group_energy() to support per-cpu capacity states
sched_group_energy() was supposed to support per-cpu capacity states
(DVFS), however, while fixing a hotplug issue this was broken as we bail
out if there is no SD_SHARE_CAP_STATES flag set.
This patch implements the hotplug race check differently and should
therefore reinstate support for per-cpu capacity states.
Change-Id: I5b865666c9ce833dcfa6514c574580d75aa0a195
Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/fair.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index fc4e2529fbd2..cbd6d12e91fe 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5442,15 +5442,7 @@ static int sched_group_energy(struct energy_env *eenv) */ sd = rcu_dereference(per_cpu(sd_scs, cpu)); - if (!sd) - /* - * We most probably raced with hotplug; returning a - * wrong energy estimation is better than entering an - * infinite loop. - */ - return -EINVAL; - - if (sd->parent) + if (sd && sd->parent) sg_shared_cap = sd->parent->groups; for_each_domain(cpu, sd) { @@ -5505,6 +5497,14 @@ static int sched_group_energy(struct energy_env *eenv) } while (sg = sg->next, sg != sd->groups); } + + /* + * If we raced with hotplug and got an sd NULL-pointer; + * returning a wrong energy estimation is better than + * entering an infinite loop. + */ + if (cpumask_test_cpu(cpu, &visit_cpus)) + return -EINVAL; next_cpu: cpumask_clear_cpu(cpu, &visit_cpus); continue; |
