From 5a84cc04b861ee6a1a94e44b2e7390e75a098d67 Mon Sep 17 00:00:00 2001 From: Zwane Mwaikambo Date: Fri, 8 Nov 2002 17:38:38 -0800 Subject: [PATCH] [PATCH] do_nmi needs irq_enter/irq_exit lovin... Use new "nmi_enter/exit()" which acts the same as the regular irq entries (increases the preempt count appropriately), but doesn't try to start processing softirqs on nmi exit (it just decreases the count). --- arch/i386/kernel/traps.c | 7 ++++++- include/asm-i386/hardirq.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index eafeba367b94..262f18025fac 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -526,12 +526,17 @@ static nmi_callback_t nmi_callback = dummy_nmi_callback; asmlinkage void do_nmi(struct pt_regs * regs, long error_code) { - int cpu = smp_processor_id(); + int cpu; + nmi_enter(); + + cpu = smp_processor_id(); ++nmi_count(cpu); if (!nmi_callback(regs, cpu)) default_do_nmi(regs); + + nmi_exit(); } void set_nmi_callback(nmi_callback_t callback) diff --git a/include/asm-i386/hardirq.h b/include/asm-i386/hardirq.h index d4460e405e9d..d2657b595d70 100644 --- a/include/asm-i386/hardirq.h +++ b/include/asm-i386/hardirq.h @@ -76,6 +76,8 @@ typedef struct { #define hardirq_endlock() do { } while (0) #define irq_enter() (preempt_count() += HARDIRQ_OFFSET) +#define nmi_enter() (irq_enter()) +#define nmi_exit() (preempt_count() -= HARDIRQ_OFFSET) #if CONFIG_PREEMPT # define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked()) -- 2.39.5