sched: fix the all pinned logic in load_balance_newidle()
PATCH 1/1 sched: fix the all pinned logic in load_balance_newidle()
nr_moved is not the correct check for triggering all pinned logic. Fix the all pinned logic in the case of load_balance_newidle().
Signed-off-by Suresh Siddha <[email protected]>
---
kernel/sched.c +3 -2
@@ -2668,6 +2668,7 @@ load_balance_newidle(int this_cpu, struct rq *this_rq, struct sched_domain *sd)unsigned long imbalance;int nr_moved =0 ;int sd_idle =0 ; +int all_pinned =0 ;cpumask_t cpus =CPU_MASK_ALL ;/*
@@ -2706,10 +2707,10 @@ redo:double_lock_balance (this_rq, busiest); nr_moved =move_tasks (this_rq, this_cpu, busiest,minus_1_or_zero (busiest->nr_running), - imbalance, sd,CPU_NEWLY_IDLE ,NULL ); + imbalance, sd,CPU_NEWLY_IDLE , &all_pinned);spin_unlock (&busiest->lock); -if (!nr_moved) { +if (unlikely (all_pinned)) {cpu_clear (cpu_of (busiest), cpus);if (!cpus_empty (cpus)) goto redo;
Quoted 2 lines · Siddha, Suresh B
nr_movedis not the correct check for triggering all pinned logic. Fix the all pinned logic in the case ofload_balance_newidle().
indeeed.
i've applied your patch to my queue. (I've done a trivial style change to it, see below.)
Ingo
--------------------->
Subject: sched: fix the all pinned logic in load_balance_newidle()
From: Suresh Siddha <[email protected]>
nr_moved is not the correct check for triggering all pinned logic. Fix the all pinned logic in the case of load_balance_newidle().
Signed-off-by Suresh Siddha <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- kernel/sched.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/sched.c +4 -2
@@ -2679,6 +2679,7 @@ load_balance_newidle(int this_cpu, strucunsigned long imbalance;int nr_moved =0 ;int sd_idle =0 ; +int all_pinned =0 ;cpumask_t cpus =CPU_MASK_ALL ;/*
@@ -2717,10 +2718,11 @@ redo:double_lock_balance (this_rq, busiest); nr_moved =move_tasks (this_rq, this_cpu, busiest,minus_1_or_zero (busiest->nr_running), - imbalance, sd,CPU_NEWLY_IDLE ,NULL ); + imbalance, sd,CPU_NEWLY_IDLE , + &all_pinned);spin_unlock (&busiest->lock); -if (!nr_moved) { +if (unlikely (all_pinned)) {cpu_clear (cpu_of (busiest), cpus);if (!cpus_empty (cpus)) goto redo;