[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20061002064127.GA20841@elte.hu>
Date: Mon, 2 Oct 2006 08:41:27 +0200
From: Ingo Molnar <mingo@...e.hu>
To: Andrew Morton <akpm@...l.org>
Cc: Thomas Gleixner <tglx@...utronix.de>,
LKML <linux-kernel@...r.kernel.org>, Jim Gettys <jg@...top.org>,
John Stultz <johnstul@...ibm.com>,
David Woodhouse <dwmw2@...radead.org>,
Arjan van de Ven <arjan@...radead.org>,
Dave Jones <davej@...hat.com>
Subject: [patch] dynticks: core, NMI watchdog fix
Andrew: find below a fix for a bug that could cause lockups if NO_HZ,
lockdep and the NMI watchdog are all activated. This patch comes after
dynticks-core.patch. Compile and boot tested.
Ingo
----------------->
Subject: dynticks: core, NMI watchdog fix
From: Ingo Molnar <mingo@...e.hu>
fix an NMI-watchdog interaction: we dont want to call
hrtimer_update_jiffies() in NMI contexts ...
create __irq_enter() (which is symmetric to __irq_exit())
and use it in nmi_enter() and irq_enter().
[ Note: like __irq_exit() it needs to be a macro because
hardirq.h is included early on and types like struct
task_struct are not available yet. ]
Signed-off-by: Ingo Molnar <mingo@...e.hu>
--
include/linux/hardirq.h | 12 +++++++++++-
kernel/softirq.c | 5 +----
2 files changed, 12 insertions(+), 5 deletions(-)
Index: linux/include/linux/hardirq.h
===================================================================
--- linux.orig/include/linux/hardirq.h
+++ linux/include/linux/hardirq.h
@@ -106,6 +106,16 @@ static inline void account_system_vtime(
* always balanced, so the interrupted value of ->hardirq_context
* will always be restored.
*/
+#define __irq_enter() \
+ do { \
+ account_system_vtime(current); \
+ add_preempt_count(HARDIRQ_OFFSET); \
+ trace_hardirq_enter(); \
+ } while (0)
+
+/*
+ * Enter irq context (on NO_HZ, update jiffies):
+ */
extern void irq_enter(void);
/*
@@ -123,7 +133,7 @@ extern void irq_enter(void);
*/
extern void irq_exit(void);
-#define nmi_enter() do { lockdep_off(); irq_enter(); } while (0)
+#define nmi_enter() do { lockdep_off(); __irq_enter(); } while (0)
#define nmi_exit() do { __irq_exit(); lockdep_on(); } while (0)
#endif /* LINUX_HARDIRQ_H */
Index: linux/kernel/softirq.c
===================================================================
--- linux.orig/kernel/softirq.c
+++ linux/kernel/softirq.c
@@ -278,10 +278,7 @@ EXPORT_SYMBOL(do_softirq);
*/
void irq_enter(void)
{
- account_system_vtime(current);
- add_preempt_count(HARDIRQ_OFFSET);
- trace_hardirq_enter();
-
+ __irq_enter();
#ifdef CONFIG_NO_HZ
if (idle_cpu(smp_processor_id()))
hrtimer_update_jiffies();
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists