From 510802be8fa948f53b1acbb7b2279b7f44d729c5 Mon Sep 17 00:00:00 2001 From: Uladzislau 2 Rezki Date: Wed, 8 Feb 2017 09:43:27 +0100 Subject: [PATCH] sched: set loop_max after rq lock is taken 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. Change-Id: I2f58f8fe96c14bd70674e600bc33caeb8aa960c6 Signed-off-by: Uladzislau 2 Rezki Signed-off-by: Artem Labazov <123321artyom@gmail.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 3c8529cab7c2..ffc2c71d0374 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10540,7 +10540,6 @@ redo: * 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); @@ -10553,6 +10552,12 @@ more_balance: goto no_move; } + /* + * 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