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

Commit c3decf0d authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

sched: Always initialize cpu-power



Often when we run into mis-shapen topologies the balance iteration
fails to update the cpu power properly and we'll end up in /0 traps.

Always initialize the cpu-power to a semi-sane value so that we can
at least boot the machine, even if the load-balancer might not
function correctly.

Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-3lbhyj25sr169ha7z3qht5na@git.kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent c1174876
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -5604,7 +5604,12 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
			break;
		}

		if (!group->sgp->power) {
		/*
		 * Even though we initialize ->power to something semi-sane,
		 * we leave power_orig unset. This allows us to detect if
		 * domain iteration is still funny without causing /0 traps.
		 */
		if (!group->sgp->power_orig) {
			printk(KERN_CONT "\n");
			printk(KERN_ERR "ERROR: domain->cpu_power not "
					"set\n");
@@ -6075,6 +6080,12 @@ build_overlap_sched_groups(struct sched_domain *sd, int cpu)
		if (atomic_inc_return(&sg->sgp->ref) == 1)
			build_group_mask(sd, sg);

		/*
		 * Initialize sgp->power such that even if we mess up the
		 * domains and no possible iteration will get us here, we won't
		 * die on a /0 trap.
		 */
		sg->sgp->power = SCHED_POWER_SCALE * cpumask_weight(sg_span);

		/*
		 * Make sure the first group of this domain contains the
+1 −1
Original line number Diff line number Diff line
@@ -3602,7 +3602,7 @@ void update_group_power(struct sched_domain *sd, int cpu)
		} while (group != child->groups);
	}

	sdg->sgp->power = power;
	sdg->sgp->power_orig = sdg->sgp->power = power;
}

/*