diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2012-05-31 06:05:32 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-06-06 10:52:27 -0400 |
commit | c3decf0dfbc95736b7c0ab68fa4e5854c4734da9 (patch) | |
tree | c21748af2b4c7e4b738cefd2076c1ccc6ed2c664 | |
parent | c1174876874dcf8986806e4dad3d7d07af20b439 (diff) |
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: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-3lbhyj25sr169ha7z3qht5na@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | kernel/sched/core.c | 13 | ||||
-rw-r--r-- | kernel/sched/fair.c | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 781acb91a50a..725ee7c1c8cf 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -5604,7 +5604,12 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level, | |||
5604 | break; | 5604 | break; |
5605 | } | 5605 | } |
5606 | 5606 | ||
5607 | if (!group->sgp->power) { | 5607 | /* |
5608 | * Even though we initialize ->power to something semi-sane, | ||
5609 | * we leave power_orig unset. This allows us to detect if | ||
5610 | * domain iteration is still funny without causing /0 traps. | ||
5611 | */ | ||
5612 | if (!group->sgp->power_orig) { | ||
5608 | printk(KERN_CONT "\n"); | 5613 | printk(KERN_CONT "\n"); |
5609 | printk(KERN_ERR "ERROR: domain->cpu_power not " | 5614 | printk(KERN_ERR "ERROR: domain->cpu_power not " |
5610 | "set\n"); | 5615 | "set\n"); |
@@ -6075,6 +6080,12 @@ build_overlap_sched_groups(struct sched_domain *sd, int cpu) | |||
6075 | if (atomic_inc_return(&sg->sgp->ref) == 1) | 6080 | if (atomic_inc_return(&sg->sgp->ref) == 1) |
6076 | build_group_mask(sd, sg); | 6081 | build_group_mask(sd, sg); |
6077 | 6082 | ||
6083 | /* | ||
6084 | * Initialize sgp->power such that even if we mess up the | ||
6085 | * domains and no possible iteration will get us here, we won't | ||
6086 | * die on a /0 trap. | ||
6087 | */ | ||
6088 | sg->sgp->power = SCHED_POWER_SCALE * cpumask_weight(sg_span); | ||
6078 | 6089 | ||
6079 | /* | 6090 | /* |
6080 | * Make sure the first group of this domain contains the | 6091 | * Make sure the first group of this domain contains the |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 54cbaa4e7b37..c9fd6d673d05 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -3602,7 +3602,7 @@ void update_group_power(struct sched_domain *sd, int cpu) | |||
3602 | } while (group != child->groups); | 3602 | } while (group != child->groups); |
3603 | } | 3603 | } |
3604 | 3604 | ||
3605 | sdg->sgp->power = power; | 3605 | sdg->sgp->power_orig = sdg->sgp->power = power; |
3606 | } | 3606 | } |
3607 | 3607 | ||
3608 | /* | 3608 | /* |