Skip to content

Commit

Permalink
sched: Check sched_domain before computing group power
Browse files Browse the repository at this point in the history
After commit 863bffc ("sched/fair: Fix group power_orig
computation"), we can dereference rq->sd before it is set.

Fix this by falling back to power_of() in this case and add a comment
explaining things.

Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
[ Added comment and tweaked patch. ]
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: mikey@neuling.org
Link: http://lkml.kernel.org/r/20131113151718.GN21461@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Srikar Dronamraju authored and Ingo Molnar committed Nov 19, 2013
1 parent 7486d6d commit 9abf24d
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions kernel/sched/fair.c
Original file line number Diff line number Diff line change
Expand Up @@ -5379,10 +5379,31 @@ void update_group_power(struct sched_domain *sd, int cpu)
*/

for_each_cpu(cpu, sched_group_cpus(sdg)) {
struct sched_group *sg = cpu_rq(cpu)->sd->groups;
struct sched_group_power *sgp;
struct rq *rq = cpu_rq(cpu);

power_orig += sg->sgp->power_orig;
power += sg->sgp->power;
/*
* build_sched_domains() -> init_sched_groups_power()
* gets here before we've attached the domains to the
* runqueues.
*
* Use power_of(), which is set irrespective of domains
* in update_cpu_power().
*
* This avoids power/power_orig from being 0 and
* causing divide-by-zero issues on boot.
*
* Runtime updates will correct power_orig.
*/
if (unlikely(!rq->sd)) {
power_orig += power_of(cpu);
power += power_of(cpu);
continue;
}

sgp = rq->sd->groups->sgp;
power_orig += sgp->power_orig;
power += sgp->power;
}
} else {
/*
Expand Down

0 comments on commit 9abf24d

Please sign in to comment.