From: Thomas Gleixner <tglx@linutronix.de>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
stable@vger.kernel.org
Subject: Re: [PATCH] nohz: Make tick_nohz_irq_exit() irq safe
Date: Wed, 20 Feb 2013 22:00:48 +0100 (CET) [thread overview]
Message-ID: <alpine.LFD.2.02.1302202155320.22263@ionos> (raw)
In-Reply-To: <1361373336-11337-1-git-send-email-fweisbec@gmail.com>
On Wed, 20 Feb 2013, Frederic Weisbecker wrote:
> As it stands, irq_exit() may or may not be called with
> irqs disabled, depending on __ARCH_IRQ_EXIT_IRQS_DISABLED
> that the arch can define.
>
> It makes tick_nohz_irq_exit() unsafe. For example two
> interrupts can race in tick_nohz_stop_sched_tick(): the inner
> most one computes the expiring time on top of the timer list,
> then it's interrupted right before reprogramming the
> clock. The new interrupt enqueues a new timer list timer,
> it reprogram the clock to take it into account and it exits.
> The CPUs resumes the inner most interrupt and performs the clock
> reprogramming without considering the new timer list timer.
>
> This regression has been introduced by:
> 280f06774afedf849f0b34248ed6aff57d0f6908
> ("nohz: Separate out irq exit and idle loop dyntick logic")
>
> Let's fix it right now with the appropriate protections.
That's not a fix. That's an hack.
> A saner long term solution will be to remove
> __ARCH_IRQ_EXIT_IRQS_DISABLED.
We really want to enforce that interrupt disabled condition for
calling irq_exit(). So why make this exclusive to tick_nohz_irq_exit()?
Thanks,
tglx
Index: linux-2.6/kernel/softirq.c
===================================================================
--- linux-2.6.orig/kernel/softirq.c
+++ linux-2.6/kernel/softirq.c
@@ -322,18 +322,10 @@ void irq_enter(void)
static inline void invoke_softirq(void)
{
- if (!force_irqthreads) {
-#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
+ if (!force_irqthreads)
__do_softirq();
-#else
- do_softirq();
-#endif
- } else {
- __local_bh_disable((unsigned long)__builtin_return_address(0),
- SOFTIRQ_OFFSET);
+ else
wakeup_softirqd();
- __local_bh_enable(SOFTIRQ_OFFSET);
- }
}
/*
@@ -341,6 +333,14 @@ static inline void invoke_softirq(void)
*/
void irq_exit(void)
{
+#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
+ unsigned long flags;
+
+ local_irq_save(flags);
+#else
+ BUG_ON(!irqs_disabled();
+#endif
+
account_irq_exit_time(current);
trace_hardirq_exit();
sub_preempt_count(IRQ_EXIT_OFFSET);
@@ -354,6 +354,9 @@ void irq_exit(void)
#endif
rcu_irq_exit();
sched_preempt_enable_no_resched();
+#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
+ local_irq_restore(flags);
+#endif
}
/*
next parent reply other threads:[~2013-02-20 21:00 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1361373336-11337-1-git-send-email-fweisbec@gmail.com>
2013-02-20 21:00 ` Thomas Gleixner [this message]
2013-02-20 22:01 ` [PATCH] nohz: Make tick_nohz_irq_exit() irq safe Frederic Weisbecker
2013-02-20 23:15 ` Thomas Gleixner
2013-02-21 16:13 ` Frederic Weisbecker
2013-02-21 16:46 ` Thomas Gleixner
2013-02-21 16:49 ` Frederic Weisbecker
2013-02-21 17:45 ` [tip:irq/urgent] irq: Ensure irq_exit() code runs with interrupts disabled tip-bot for Thomas Gleixner
2013-02-21 19:48 ` Frederic Weisbecker
2013-02-21 19:51 ` Thomas Gleixner
2013-02-21 17:46 ` [tip:irq/urgent] irq: Sanitize invoke_softirq tip-bot for Thomas Gleixner
2013-02-21 17:53 ` [PATCH] nohz: Make tick_nohz_irq_exit() irq safe Linus Torvalds
2013-02-21 18:21 ` Thomas Gleixner
2013-02-21 18:28 ` Linus Torvalds
2013-02-22 8:54 ` Ingo Molnar
2013-02-21 20:05 ` [tip:irq/urgent] irq: Ensure irq_exit() code runs with interrupts disabled tip-bot for Thomas Gleixner
2013-02-21 20:07 ` [tip:irq/urgent] irq: Sanitize invoke_softirq tip-bot for Thomas Gleixner
2013-02-21 17:43 ` [tip:irq/urgent] nohz: Make tick_nohz_irq_exit() irq safe tip-bot for Frederic Weisbecker
2013-02-21 20:04 ` tip-bot for Frederic Weisbecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.2.02.1302202155320.22263@ionos \
--to=tglx@linutronix.de \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox