diff options
Diffstat (limited to 'kernel/sched')
-rw-r--r-- | kernel/sched/core.c | 7 | ||||
-rw-r--r-- | kernel/sched/fair.c | 25 |
2 files changed, 25 insertions, 7 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 55733616baaa..3a69374fb427 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -6030,11 +6030,14 @@ build_overlap_sched_groups(struct sched_domain *sd, int cpu) | |||
6030 | 6030 | ||
6031 | cpumask_or(covered, covered, sg_span); | 6031 | cpumask_or(covered, covered, sg_span); |
6032 | 6032 | ||
6033 | sg->sgp = *per_cpu_ptr(sdd->sgp, cpumask_first(sg_span)); | 6033 | sg->sgp = *per_cpu_ptr(sdd->sgp, i); |
6034 | atomic_inc(&sg->sgp->ref); | 6034 | atomic_inc(&sg->sgp->ref); |
6035 | 6035 | ||
6036 | if (cpumask_test_cpu(cpu, sg_span)) | 6036 | if ((!groups && cpumask_test_cpu(cpu, sg_span)) || |
6037 | cpumask_first(sg_span) == cpu) { | ||
6038 | WARN_ON_ONCE(!cpumask_test_cpu(cpu, sg_span)); | ||
6037 | groups = sg; | 6039 | groups = sg; |
6040 | } | ||
6038 | 6041 | ||
6039 | if (!first) | 6042 | if (!first) |
6040 | first = sg; | 6043 | first = sg; |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 940e6d17cf96..f0380d4987b3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -3574,11 +3574,26 @@ void update_group_power(struct sched_domain *sd, int cpu) | |||
3574 | 3574 | ||
3575 | power = 0; | 3575 | power = 0; |
3576 | 3576 | ||
3577 | group = child->groups; | 3577 | if (child->flags & SD_OVERLAP) { |
3578 | do { | 3578 | /* |
3579 | power += group->sgp->power; | 3579 | * SD_OVERLAP domains cannot assume that child groups |
3580 | group = group->next; | 3580 | * span the current group. |
3581 | } while (group != child->groups); | 3581 | */ |
3582 | |||
3583 | for_each_cpu(cpu, sched_group_cpus(sdg)) | ||
3584 | power += power_of(cpu); | ||
3585 | } else { | ||
3586 | /* | ||
3587 | * !SD_OVERLAP domains can assume that child groups | ||
3588 | * span the current group. | ||
3589 | */ | ||
3590 | |||
3591 | group = child->groups; | ||
3592 | do { | ||
3593 | power += group->sgp->power; | ||
3594 | group = group->next; | ||
3595 | } while (group != child->groups); | ||
3596 | } | ||
3582 | 3597 | ||
3583 | sdg->sgp->power = power; | 3598 | sdg->sgp->power = power; |
3584 | } | 3599 | } |