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 /kernel/sched | |
| 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>
Diffstat (limited to 'kernel/sched')
| -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 | /* |
