From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932543AbcFCKty (ORCPT ); Fri, 3 Jun 2016 06:49:54 -0400 Received: from terminus.zytor.com ([198.137.202.10]:56042 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932254AbcFCKtx (ORCPT ); Fri, 3 Jun 2016 06:49:53 -0400 Date: Fri, 3 Jun 2016 03:49:03 -0700 From: tip-bot for Oleg Nesterov Message-ID: Cc: tglx@linutronix.de, linux-kernel@vger.kernel.org, ktkhai@parallels.com, tkhai@yandex.ru, oleg@redhat.com, efault@gmx.de, mingo@kernel.org, peterz@infradead.org, torvalds@linux-foundation.org, cl@linux.com, vdavydov@parallels.com, hpa@zytor.com, cmetcalf@ezchip.com Reply-To: peterz@infradead.org, mingo@kernel.org, vdavydov@parallels.com, cmetcalf@ezchip.com, hpa@zytor.com, cl@linux.com, torvalds@linux-foundation.org, tglx@linutronix.de, efault@gmx.de, oleg@redhat.com, tkhai@yandex.ru, ktkhai@parallels.com, linux-kernel@vger.kernel.org In-Reply-To: <20160518195733.GA15914@redhat.com> References: <20160518195733.GA15914@redhat.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] sched/fair: Use task_rcu_dereference() Git-Commit-ID: bac7857319bcf7fed329a10bb760053e761115c0 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: bac7857319bcf7fed329a10bb760053e761115c0 Gitweb: http://git.kernel.org/tip/bac7857319bcf7fed329a10bb760053e761115c0 Author: Oleg Nesterov AuthorDate: Wed, 18 May 2016 21:57:33 +0200 Committer: Ingo Molnar CommitDate: Fri, 3 Jun 2016 09:18:58 +0200 sched/fair: Use task_rcu_dereference() Simplify task_numa_compare()'s task reference magic by using task_rcu_dereference(). Signed-off-by: Oleg Nesterov Signed-off-by: Peter Zijlstra (Intel) Cc: Chris Metcalf Cc: Christoph Lameter Cc: Kirill Tkhai Cc: Kirill Tkhai Cc: Linus Torvalds Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Vladimir Davydov Link: http://lkml.kernel.org/r/20160518195733.GA15914@redhat.com Signed-off-by: Ingo Molnar --- kernel/sched/fair.c | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1e87bb6..c6dd8ba 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1305,6 +1305,8 @@ static void task_numa_assign(struct task_numa_env *env, { if (env->best_task) put_task_struct(env->best_task); + if (p) + get_task_struct(p); env->best_task = p; env->best_imp = imp; @@ -1372,31 +1374,11 @@ static void task_numa_compare(struct task_numa_env *env, long imp = env->p->numa_group ? groupimp : taskimp; long moveimp = imp; int dist = env->dist; - bool assigned = false; rcu_read_lock(); - - raw_spin_lock_irq(&dst_rq->lock); - cur = dst_rq->curr; - /* - * No need to move the exiting task or idle task. - */ - if ((cur->flags & PF_EXITING) || is_idle_task(cur)) + cur = task_rcu_dereference(&dst_rq->curr); + if (cur && ((cur->flags & PF_EXITING) || is_idle_task(cur))) cur = NULL; - else { - /* - * The task_struct must be protected here to protect the - * p->numa_faults access in the task_weight since the - * numa_faults could already be freed in the following path: - * finish_task_switch() - * --> put_task_struct() - * --> __put_task_struct() - * --> task_numa_free() - */ - get_task_struct(cur); - } - - raw_spin_unlock_irq(&dst_rq->lock); /* * Because we have preemption enabled we can get migrated around and @@ -1479,7 +1461,6 @@ balance: */ if (!load_too_imbalanced(src_load, dst_load, env)) { imp = moveimp - 1; - put_task_struct(cur); cur = NULL; goto assign; } @@ -1505,16 +1486,9 @@ balance: env->dst_cpu = select_idle_sibling(env->p, env->dst_cpu); assign: - assigned = true; task_numa_assign(env, cur, imp); unlock: rcu_read_unlock(); - /* - * The dst_rq->curr isn't assigned. The protection for task_struct is - * finished. - */ - if (cur && !assigned) - put_task_struct(cur); } static void task_numa_find_cpu(struct task_numa_env *env,