sched: Fix nohz_idle_balance()
authorVincent Guittot <vincent.guittot@linaro.org>
Thu, 13 Sep 2012 04:11:26 +0000 (06:11 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 13 Sep 2012 14:52:03 +0000 (16:52 +0200)
On tickless systems, one CPU runs load balance for all idle CPUs.

The cpu_load of this CPU is updated before starting the load balance
of each other idle CPUs. We should instead update the cpu_load of
the balance_cpu.

Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Venkatesh Pallipadi <venki@google.com>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Link: http://lkml.kernel.org/r/1347509486-8688-1-git-send-email-vincent.guittot@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/fair.c

index 1ca4fe4..9ae3a5b 100644 (file)
@@ -4794,14 +4794,15 @@ static void nohz_idle_balance(int this_cpu, enum cpu_idle_type idle)
                if (need_resched())
                        break;
 
-               raw_spin_lock_irq(&this_rq->lock);
-               update_rq_clock(this_rq);
-               update_idle_cpu_load(this_rq);
-               raw_spin_unlock_irq(&this_rq->lock);
+               rq = cpu_rq(balance_cpu);
+
+               raw_spin_lock_irq(&rq->lock);
+               update_rq_clock(rq);
+               update_idle_cpu_load(rq);
+               raw_spin_unlock_irq(&rq->lock);
 
                rebalance_domains(balance_cpu, CPU_IDLE);
 
-               rq = cpu_rq(balance_cpu);
                if (time_after(this_rq->next_balance, rq->next_balance))
                        this_rq->next_balance = rq->next_balance;
        }