From e917ca779fad7e1c3a2d4c1f0992596fc68acf47 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 31 May 2012 12:05:32 +0200 Subject: [PATCH] --- yaml --- r: 310639 b: refs/heads/master c: c3decf0dfbc95736b7c0ab68fa4e5854c4734da9 h: refs/heads/master i: 310637: 532d71f1cdcdfa13b786a4a705f81cfc53328d67 310635: a3836f81bf7574e4b18882bf752b08c14d8e3675 310631: 0677786a3d52c82497e9e6219a1d06fbb562035a 310623: 29e89759acdae865fb68941af3b760c8fa498c49 v: v3 --- [refs] | 2 +- trunk/kernel/sched/core.c | 13 ++++++++++++- trunk/kernel/sched/fair.c | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index e9d3b03af1ac..026ef370581d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c1174876874dcf8986806e4dad3d7d07af20b439 +refs/heads/master: c3decf0dfbc95736b7c0ab68fa4e5854c4734da9 diff --git a/trunk/kernel/sched/core.c b/trunk/kernel/sched/core.c index 781acb91a50a..725ee7c1c8cf 100644 --- a/trunk/kernel/sched/core.c +++ b/trunk/kernel/sched/core.c @@ -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 diff --git a/trunk/kernel/sched/fair.c b/trunk/kernel/sched/fair.c index 54cbaa4e7b37..c9fd6d673d05 100644 --- a/trunk/kernel/sched/fair.c +++ b/trunk/kernel/sched/fair.c @@ -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; } /*