sched: Reset loop counters if all tasks are pinned and we need to redo load balance
authorPrashanth Nageshappa <prashanth@linux.vnet.ibm.com>
Tue, 19 Jun 2012 12:22:07 +0000 (17:52 +0530)
committerIngo Molnar <mingo@kernel.org>
Tue, 24 Jul 2012 11:55:37 +0000 (13:55 +0200)
While load balancing, if all tasks on the source runqueue are pinned,
we retry after excluding the corresponding source cpu. However, loop counters
env.loop and env.loop_break are not reset before retrying, which can lead
to failure in moving the tasks. In this patch we reset env.loop and
env.loop_break to their inital values before we retry.

Signed-off-by: Prashanth Nageshappa <prashanth@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/4FE06EEF.2090709@linux.vnet.ibm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/fair.c

index 9361669d42422da202f5d6402a1d195e5a051b28..f9f9aa0edf3c47f8731d4a7f43ca3ef1872fdfce 100644 (file)
@@ -4288,8 +4288,11 @@ 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))
+                       if (!cpumask_empty(cpus)) {
+                               env.loop = 0;
+                               env.loop_break = sched_nr_migrate_break;
                                goto redo;
+                       }
                        goto out_balanced;
                }
        }