From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755749AbdABPkD (ORCPT ); Mon, 2 Jan 2017 10:40:03 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:33029 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750897AbdABPkC (ORCPT ); Mon, 2 Jan 2017 10:40:02 -0500 From: Uladzislau Rezki To: Peter Zijlstra Cc: LKML , Uladzislau 2 Rezki Subject: [RFC 1/3] sched: set loop_max after rq lock is taken Date: Mon, 2 Jan 2017 16:39:46 +0100 Message-Id: <1483371588-17140-1-git-send-email-urezki@gmail.com> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Uladzislau 2 Rezki 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 --- 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 c242944..c5d9351 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7744,12 +7744,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