From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757657Ab2IFPOI (ORCPT ); Thu, 6 Sep 2012 11:14:08 -0400 Received: from merlin.infradead.org ([205.233.59.134]:59336 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757617Ab2IFPOF convert rfc822-to-8bit (ORCPT ); Thu, 6 Sep 2012 11:14:05 -0400 Message-ID: <1346944328.18408.34.camel@twins> Subject: Re: [PATCH tip/core/rcu 14/15] time: RCU permitted to stop idle entry via softirq From: Peter Zijlstra To: "Paul E. McKenney" Cc: linux-kernel@vger.kernel.org, mingo@elte.hu, laijs@cn.fujitsu.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca, josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de, rostedt@goodmis.org, Valdis.Kletnieks@vt.edu, dhowells@redhat.com, eric.dumazet@gmail.com, darren@dvhart.com, fweisbec@gmail.com, sbw@mit.edu, patches@linaro.org, "Paul E. McKenney" Date: Thu, 06 Sep 2012 17:12:08 +0200 In-Reply-To: <1346352988-32444-14-git-send-email-paulmck@linux.vnet.ibm.com> References: <20120830185607.GA32148@linux.vnet.ibm.com> <1346352988-32444-1-git-send-email-paulmck@linux.vnet.ibm.com> <1346352988-32444-14-git-send-email-paulmck@linux.vnet.ibm.com> Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7BIT X-Mailer: Evolution 3.2.2- Mime-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2012-08-30 at 11:56 -0700, Paul E. McKenney wrote: > From: "Paul E. McKenney" > > The can_stop_idle_tick() function complains if a softirq vector is > raised too late in the idle-entry process, presumably in order to > prevent dangling softirq invocations from being delayed across the > full idle period, which might be indefinitely long -- and if softirq > was asserted any later than the call to this function, such a delay > might well happen. > > However, RCU needs to be able to use softirq to stop idle entry in > order to be able to drain RCU callbacks from the current CPU, which in > turn enables faster entry into dyntick-idle mode, which in turn reduces > power consumption. Because RCU takes this action at a well-defined > point in the idle-entry path, it is safe for RCU to take this approach. > > This commit therefore silences the error message that is sometimes > produced when the going-idle CPU suddenly finds that it has an RCU_SOFTIRQ > to process. The error message will continue to be issued for other > softirq vectors. > > Reported-by: Sedat Dilek > Signed-off-by: Paul E. McKenney > Signed-off-by: Paul E. McKenney > Tested-by: Sedat Dilek > --- > include/linux/interrupt.h | 2 ++ > kernel/time/tick-sched.c | 3 ++- > 2 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h > index c5f856a..5e4e617 100644 > --- a/include/linux/interrupt.h > +++ b/include/linux/interrupt.h > @@ -430,6 +430,8 @@ enum > NR_SOFTIRQS > }; > > +#define SOFTIRQ_STOP_IDLE_MASK (~(1 << RCU_SOFTIRQ)) > + > /* map softirq index to softirq name. update 'softirq_to_name' in > * kernel/softirq.c when adding a new softirq. > */ > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index 024540f..4b1785a 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -436,7 +436,8 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) > if (unlikely(local_softirq_pending() && cpu_online(cpu))) { > static int ratelimit; > > - if (ratelimit < 10) { > + if (ratelimit < 10 && > + (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { > printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", > (unsigned int) local_softirq_pending()); > ratelimit++; Urgh.. yuck. So either add a very verbose comment here on why its OK for RCU (the changelog is rather vague about it), or try and come up with something better. Where does RCU flush the pending softirq? Does it flush all softirqs or only the RCU one? Can we move the check after RCU does this so we can avoid the special case?