diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/fair.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index e8b652ebe027..fd773ade1a31 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -5379,10 +5379,31 @@ void update_group_power(struct sched_domain *sd, int cpu) | |||
| 5379 | */ | 5379 | */ |
| 5380 | 5380 | ||
| 5381 | for_each_cpu(cpu, sched_group_cpus(sdg)) { | 5381 | for_each_cpu(cpu, sched_group_cpus(sdg)) { |
| 5382 | struct sched_group *sg = cpu_rq(cpu)->sd->groups; | 5382 | struct sched_group_power *sgp; |
| 5383 | struct rq *rq = cpu_rq(cpu); | ||
| 5383 | 5384 | ||
| 5384 | power_orig += sg->sgp->power_orig; | 5385 | /* |
| 5385 | power += sg->sgp->power; | 5386 | * build_sched_domains() -> init_sched_groups_power() |
| 5387 | * gets here before we've attached the domains to the | ||
| 5388 | * runqueues. | ||
| 5389 | * | ||
| 5390 | * Use power_of(), which is set irrespective of domains | ||
| 5391 | * in update_cpu_power(). | ||
| 5392 | * | ||
| 5393 | * This avoids power/power_orig from being 0 and | ||
| 5394 | * causing divide-by-zero issues on boot. | ||
| 5395 | * | ||
| 5396 | * Runtime updates will correct power_orig. | ||
| 5397 | */ | ||
| 5398 | if (unlikely(!rq->sd)) { | ||
| 5399 | power_orig += power_of(cpu); | ||
| 5400 | power += power_of(cpu); | ||
| 5401 | continue; | ||
| 5402 | } | ||
| 5403 | |||
| 5404 | sgp = rq->sd->groups->sgp; | ||
| 5405 | power_orig += sgp->power_orig; | ||
| 5406 | power += sgp->power; | ||
| 5386 | } | 5407 | } |
| 5387 | } else { | 5408 | } else { |
| 5388 | /* | 5409 | /* |
