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>
This commit is contained in:
Morten Rasmussen 2017-02-06 16:28:53 +00:00 committed by Andres Oportus
parent fef0112a63
commit fc969e3bfa

View file

@ -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;