Messages in this thread Patch in this message | | | From | Uladzislau Rezki <> | Subject | [RFC,v2 1/3] sched: set loop_max after rq lock is taken | Date | Wed, 8 Feb 2017 09:43:27 +0100 |
| |
From: Uladzislau 2 Rezki <uladzislau2.rezki@sonymobile.com>
While doing a load balance there is a race in setting loop_max variable since nr_running can be changed causing incorect iteration loops.
As a result we may skip some candidates or check the same tasks again.
Signed-off-by: Uladzislau 2 Rezki <uladzislau2.rezki@sonymobile.com> --- kernel/sched/fair.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 6559d19..4be7193 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8073,12 +8073,17 @@ static int load_balance(int this_cpu, struct rq *this_rq, * correctly treated as an imbalance. */ env.flags |= LBF_ALL_PINNED; - env.loop_max = min(sysctl_sched_nr_migrate, busiest->nr_running); more_balance: raw_spin_lock_irqsave(&busiest->lock, flags); /* + * Set loop_max when rq's lock is taken to prevent a race. + */ + env.loop_max = min(sysctl_sched_nr_migrate, + busiest->nr_running); + + /* * cur_ld_moved - load moved in current iteration * ld_moved - cumulative load moved across iterations */ -- 2.1.4
| |