Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9abf24d4 authored by Srikar Dronamraju's avatar Srikar Dronamraju Committed by Ingo Molnar
Browse files

sched: Check sched_domain before computing group power



After commit 863bffc8 ("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: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
[ Added comment and tweaked patch. ]
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Cc: mikey@neuling.org
Link: http://lkml.kernel.org/r/20131113151718.GN21461@twins.programming.kicks-ass.net


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 7486d6da
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -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);

			/*
			 * 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;
			}

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