Commit 88b8dac0 makes load_balance() consider other cpus in its group. So, now, When we redo in load_balance(), we should reset some fields of lb_env to ensure that load_balance() works for initial cpu, not for other cpus in its group. So correct it.
Cc: Srivatsa Vaddagiri <va...@linux.vnet.ibm.com> Signed-off-by: Joonsoo Kim <iamjoonsoo....@lge.com> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 70631e8..25c798c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5014,14 +5014,20 @@ static int load_balance(int this_cpu, struct rq *this_rq, struct lb_env env = { .sd = sd, - .dst_cpu = this_cpu, - .dst_rq = this_rq, .dst_grpmask = dst_grp, .idle = idle, - .loop_break = sched_nr_migrate_break, .cpus = cpus, }; + schedstat_inc(sd, lb_count[idle]); + cpumask_copy(cpus, cpu_active_mask); + +redo: + env.dst_cpu = this_cpu; + env.dst_rq = this_rq; + env.loop = 0; + env.loop_break = sched_nr_migrate_break; + /* For NEWLY_IDLE load_balancing, we don't need to consider * other cpus in our group */ if (idle == CPU_NEWLY_IDLE) { @@ -5030,11 +5036,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, cpumask_copy(dst_grp, sched_group_cpus(sd->groups)); cpumask_clear_cpu(env.dst_cpu, env.dst_grpmask); } - cpumask_copy(cpus, cpu_active_mask); - schedstat_inc(sd, lb_count[idle]); - -redo: group = find_busiest_group(&env, balance); if (*balance == 0) @@ -5133,11 +5135,9 @@ more_balance: /* All tasks on this runqueue were pinned by CPU affinity */ if (unlikely(env.flags & LBF_ALL_PINNED)) { cpumask_clear_cpu(cpu_of(busiest), cpus); - if (!cpumask_empty(cpus)) { - env.loop = 0; - env.loop_break = sched_nr_migrate_break; + if (!cpumask_empty(cpus)) goto redo; - } + goto out_balanced; } } -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/