From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751434AbdL2QMT (ORCPT ); Fri, 29 Dec 2017 11:12:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:59286 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751159AbdL2QMR (ORCPT ); Fri, 29 Dec 2017 11:12:17 -0500 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 77F6B2197D Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=frederic@kernel.org Date: Fri, 29 Dec 2017 17:12:13 +0100 From: Frederic Weisbecker To: Thomas Gleixner Cc: LKML , Anna-Maria Gleixner , Sebastian Siewior , Paul McKenney , Peter Zijlstra , Frederic Weisbecker , Ingo Molnar , stable@vger.kernel.org Subject: Re: [patch 2/4] nohz: Prevent erroneous tick stop invocations Message-ID: <20171229161209.GA12731@lerouge> References: <20171222145111.919609918@linutronix.de> <20171222145337.713295508@linutronix.de> <20171226151746.GA6560@lerouge> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Dec 27, 2017 at 09:58:08PM +0100, Thomas Gleixner wrote: > On Wed, 27 Dec 2017, Thomas Gleixner wrote: > > Bah, no. We need to move that into the nohz logic somehow to prevent that > > repetitive expiry yesterday reprogramming. Lemme think about it some more. > > The patch below should be the proper cure. > > Thanks, > > tglx > > 8<------------------- > Subject: nohz: Prevent a timer interrupt storm in tick_nohz_stop_sched_tick() > From: Thomas Gleixner > Date: Fri, 22 Dec 2017 15:51:13 +0100 > > From: Thomas Gleixner > > The conditions in irq_exit() to invoke tick_nohz_irq_exit() which > subsequently invokes tick_nohz_stop_sched_tick() are: > > if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) > > If need_resched() is not set, but a timer softirq is pending then this is > an indication that the softirq code punted and delegated the execution to > softirqd. need_resched() is not true because the current interrupted task > takes precedence over softirqd. > > Invoking tick_nohz_irq_exit() in this case can cause an endless loop of > timer interrupts because the timer wheel contains an expired timer, but > softirqs are not yet executed. So it returns an immediate expiry request, > which causes the timer to fire immediately again. Lather, rinse and > repeat.... > > Prevent that by adding a check for a pending timer soft interrupt to the > conditions in tick_nohz_stop_sched_tick() which avoid calling > get_next_timer_interrupt(). That keeps the tick sched timer on the tick and > prevents a repetitive programming of an already expired timer. > > Signed-off-by: Thomas Gleixner > Cc: Peter Zijlstra > Cc: Frederic Weisbecker > Cc: Sebastian Siewior > Cc: stable@vger.kernel.org > Cc: Paul McKenney > Cc: Anna-Maria Gleixner > > --- > kernel/time/tick-sched.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -650,6 +650,11 @@ static void tick_nohz_restart(struct tic > ts->next_tick = 0; > } > > +static inline bool local_timer_softirq_pending(void) > +{ > + return local_softirq_pending & TIMER_SOFTIRQ; > +} > + > static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, > ktime_t now, int cpu) > { > @@ -666,8 +671,8 @@ static ktime_t tick_nohz_stop_sched_tick > } while (read_seqretry(&jiffies_lock, seq)); > ts->last_jiffies = basejiff; > > - if (rcu_needs_cpu(basemono, &next_rcu) || > - arch_needs_cpu() || irq_work_needs_cpu()) { > + if (rcu_needs_cpu(basemono, &next_rcu) || arch_needs_cpu() || > + irq_work_needs_cpu() || local_timer_softirq_pending()) { Much better. This may need a comment though because it's not immediately obvious why we have this check while softirqs are processed just before tick_irq_exit(). Thanks. Acked-by: Frederic Weisbecker