From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754874Ab1HOPxa (ORCPT ); Mon, 15 Aug 2011 11:53:30 -0400 Received: from mail-vx0-f174.google.com ([209.85.220.174]:51689 "EHLO mail-vx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754797Ab1HOPx0 (ORCPT ); Mon, 15 Aug 2011 11:53:26 -0400 From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Andrew Morton , Anton Blanchard , Avi Kivity , Ingo Molnar , Lai Jiangshan , "Paul E . McKenney" , Paul Menage , Peter Zijlstra , Stephen Hemminger , Thomas Gleixner , Tim Pepper Subject: [PATCH 14/32] nohz/cpuset: Don't turn off the tick if rcu needs it Date: Mon, 15 Aug 2011 17:52:11 +0200 Message-Id: <1313423549-27093-15-git-send-email-fweisbec@gmail.com> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1313423549-27093-1-git-send-email-fweisbec@gmail.com> References: <1313423549-27093-1-git-send-email-fweisbec@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If RCU is waiting for the current CPU to complete a grace period, don't turn off the tick. Unlike dynctik-idle, we are not necessarily going to enter into rcu extended quiescent state, so we may need to keep the tick to note current CPU's quiescent states. Signed-off-by: Frederic Weisbecker Cc: Andrew Morton Cc: Anton Blanchard Cc: Avi Kivity Cc: Ingo Molnar Cc: Lai Jiangshan Cc: Paul E . McKenney Cc: Paul Menage Cc: Peter Zijlstra Cc: Stephen Hemminger Cc: Thomas Gleixner Cc: Tim Pepper --- include/linux/rcupdate.h | 1 + kernel/rcutree.c | 3 +-- kernel/sched.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 99f9aa7..55a482a 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -133,6 +133,7 @@ static inline int rcu_preempt_depth(void) extern void rcu_sched_qs(int cpu); extern void rcu_bh_qs(int cpu); extern void rcu_check_callbacks(int cpu, int user); +extern int rcu_pending(int cpu); struct notifier_block; #ifdef CONFIG_NO_HZ diff --git a/kernel/rcutree.c b/kernel/rcutree.c index ba06207..0009bfc 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -205,7 +205,6 @@ int rcu_cpu_stall_suppress __read_mostly; module_param(rcu_cpu_stall_suppress, int, 0644); static void force_quiescent_state(struct rcu_state *rsp, int relaxed); -static int rcu_pending(int cpu); /* * Return the number of RCU-sched batches processed thus far for debug & stats. @@ -1729,7 +1728,7 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) * by the current CPU, returning 1 if so. This function is part of the * RCU implementation; it is -not- an exported member of the RCU API. */ -static int rcu_pending(int cpu) +int rcu_pending(int cpu) { return __rcu_pending(&rcu_sched_state, &per_cpu(rcu_sched_data, cpu)) || __rcu_pending(&rcu_bh_state, &per_cpu(rcu_bh_data, cpu)) || diff --git a/kernel/sched.c b/kernel/sched.c index 0e1aa4e..353a66f 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -2439,6 +2439,7 @@ DEFINE_PER_CPU(int, task_nohz_mode); bool cpuset_nohz_can_stop_tick(void) { struct rq *rq; + int cpu; rq = this_rq(); @@ -2446,6 +2447,19 @@ bool cpuset_nohz_can_stop_tick(void) if (rq->nr_running > 1) return false; + cpu = smp_processor_id(); + + /* + * FIXME: will probably be removed soon as it's + * already checked from tick_nohz_stop_sched_tick() + */ + if (rcu_needs_cpu(cpu)) + return false; + + /* Is there a grace period to complete ? */ + if (rcu_pending(cpu)) + return false; + return true; } -- 1.7.5.4