mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: undisclosed-recipients:;
Subject: [PATCH for review] [12/145] i386/x86-64: Remove un/set_nmi_callback and reserve/release_lapic_nmi functions
Date: Thu, 10 Aug 2006 21:35:24 +0200 (CEST)	[thread overview]
Message-ID: <20060810193524.A7CFA13C23@wotan.suse.de> (raw)
In-Reply-To: <20060810 935.775038000@suse.de>

r

From: dzickus <dzickus@redhat.com>

Removes the un/set_nmi_callback and reserve/release_lapic_nmi functions as
they are no longer needed.  The various subsystems are modified to register
with the die_notifier instead. 

Also includes compile fixes by Andrew Morton.

Signed-off-by:  Don Zickus <dzickus@redhat.com>
Signed-off-by: Andi Kleen <ak@suse.de>

---
 arch/i386/kernel/crash.c           |   20 ++++++-
 arch/i386/kernel/nmi.c             |   85 +++---------------------------
 arch/i386/kernel/traps.c           |   23 --------
 arch/i386/oprofile/nmi_int.c       |   47 ++++++++++-------
 arch/i386/oprofile/nmi_timer_int.c |   33 +++++++++--
 arch/x86_64/kernel/crash.c         |   20 ++++++-
 arch/x86_64/kernel/nmi.c           |  102 ++-----------------------------------
 include/asm-i386/nmi.h             |   21 +------
 include/asm-x86_64/nmi.h           |   21 -------
 kernel/sysctl.c                    |    4 -
 10 files changed, 116 insertions(+), 260 deletions(-)

Index: linux/arch/x86_64/kernel/nmi.c
===================================================================
--- linux.orig/arch/x86_64/kernel/nmi.c
+++ linux/arch/x86_64/kernel/nmi.c
@@ -41,20 +41,6 @@ static DEFINE_PER_CPU(unsigned, evntsel_
  */
 #define NMI_MAX_COUNTER_BITS 66
 
-/*
- * lapic_nmi_owner tracks the ownership of the lapic NMI hardware:
- * - it may be reserved by some other driver, or not
- * - when not reserved by some other driver, it may be used for
- *   the NMI watchdog, or not
- *
- * This is maintained separately from nmi_active because the NMI
- * watchdog may also be driven from the I/O APIC timer.
- */
-static DEFINE_SPINLOCK(lapic_nmi_owner_lock);
-static unsigned int lapic_nmi_owner;
-#define LAPIC_NMI_WATCHDOG	(1<<0)
-#define LAPIC_NMI_RESERVED	(1<<1)
-
 /* nmi_active:
  * >0: the lapic NMI watchdog is active, but can be disabled
  * <0: the lapic NMI watchdog has not been set up, and cannot
@@ -321,33 +307,6 @@ static void enable_lapic_nmi_watchdog(vo
 	touch_nmi_watchdog();
 }
 
-int reserve_lapic_nmi(void)
-{
-	unsigned int old_owner;
-
-	spin_lock(&lapic_nmi_owner_lock);
-	old_owner = lapic_nmi_owner;
-	lapic_nmi_owner |= LAPIC_NMI_RESERVED;
-	spin_unlock(&lapic_nmi_owner_lock);
-	if (old_owner & LAPIC_NMI_RESERVED)
-		return -EBUSY;
-	if (old_owner & LAPIC_NMI_WATCHDOG)
-		disable_lapic_nmi_watchdog();
-	return 0;
-}
-
-void release_lapic_nmi(void)
-{
-	unsigned int new_owner;
-
-	spin_lock(&lapic_nmi_owner_lock);
-	new_owner = lapic_nmi_owner & ~LAPIC_NMI_RESERVED;
-	lapic_nmi_owner = new_owner;
-	spin_unlock(&lapic_nmi_owner_lock);
-	if (new_owner & LAPIC_NMI_WATCHDOG)
-		enable_lapic_nmi_watchdog();
-}
-
 void disable_timer_nmi_watchdog(void)
 {
 	BUG_ON(nmi_watchdog != NMI_IO_APIC);
@@ -762,13 +721,6 @@ done:
 	return rc;
 }
 
-static __kprobes int dummy_nmi_callback(struct pt_regs * regs, int cpu)
-{
-	return 0;
-}
- 
-static nmi_callback_t nmi_callback = dummy_nmi_callback;
- 
 asmlinkage __kprobes void do_nmi(struct pt_regs * regs, long error_code)
 {
 	nmi_enter();
@@ -779,21 +731,12 @@ asmlinkage __kprobes void do_nmi(struct 
 
 int do_nmi_callback(struct pt_regs * regs, int cpu)
 {
-	return rcu_dereference(nmi_callback)(regs, cpu);
-}
-
-void set_nmi_callback(nmi_callback_t callback)
-{
-	vmalloc_sync_all();
-	rcu_assign_pointer(nmi_callback, callback);
-}
-EXPORT_SYMBOL_GPL(set_nmi_callback);
-
-void unset_nmi_callback(void)
-{
-	nmi_callback = dummy_nmi_callback;
+#ifdef CONFIG_SYSCTL
+	if (unknown_nmi_panic)
+		return unknown_nmi_panic_callback(regs, cpu);
+#endif
+	return 0;
 }
-EXPORT_SYMBOL_GPL(unset_nmi_callback);
 
 #ifdef CONFIG_SYSCTL
 
@@ -802,37 +745,8 @@ static int unknown_nmi_panic_callback(st
 	unsigned char reason = get_nmi_reason();
 	char buf[64];
 
-	if (!(reason & 0xc0)) {
-		sprintf(buf, "NMI received for unknown reason %02x\n", reason);
-		die_nmi(buf,regs);
-	}
-	return 0;
-}
-
-/*
- * proc handler for /proc/sys/kernel/unknown_nmi_panic
- */
-int proc_unknown_nmi_panic(struct ctl_table *table, int write, struct file *file,
-			void __user *buffer, size_t *length, loff_t *ppos)
-{
-	int old_state;
-
-	old_state = unknown_nmi_panic;
-	proc_dointvec(table, write, file, buffer, length, ppos);
-	if (!!old_state == !!unknown_nmi_panic)
-		return 0;
-
-	if (unknown_nmi_panic) {
-		if (reserve_lapic_nmi() < 0) {
-			unknown_nmi_panic = 0;
-			return -EBUSY;
-		} else {
-			set_nmi_callback(unknown_nmi_panic_callback);
-		}
-	} else {
-		release_lapic_nmi();
-		unset_nmi_callback();
-	}
+	sprintf(buf, "NMI received for unknown reason %02x\n", reason);
+	die_nmi(buf,regs);
 	return 0;
 }
 
@@ -846,8 +760,6 @@ EXPORT_SYMBOL(reserve_perfctr_nmi);
 EXPORT_SYMBOL(release_perfctr_nmi);
 EXPORT_SYMBOL(reserve_evntsel_nmi);
 EXPORT_SYMBOL(release_evntsel_nmi);
-EXPORT_SYMBOL(reserve_lapic_nmi);
-EXPORT_SYMBOL(release_lapic_nmi);
 EXPORT_SYMBOL(disable_timer_nmi_watchdog);
 EXPORT_SYMBOL(enable_timer_nmi_watchdog);
 EXPORT_SYMBOL(touch_nmi_watchdog);
Index: linux/include/asm-x86_64/nmi.h
===================================================================
--- linux.orig/include/asm-x86_64/nmi.h
+++ linux/include/asm-x86_64/nmi.h
@@ -7,25 +7,6 @@
 #include <linux/pm.h>
 #include <asm/io.h>
  
-struct pt_regs;
-
-typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu);
-
-/**
- * set_nmi_callback
- *
- * Set a handler for an NMI. Only one handler may be
- * set. Return 1 if the NMI was handled.
- */
-void set_nmi_callback(nmi_callback_t callback);
-
-/**
- * unset_nmi_callback
- *
- * Remove the handler previously set.
- */
-void unset_nmi_callback(void);
-
 /**
  * do_nmi_callback
  *
@@ -72,8 +53,6 @@ extern int reserve_evntsel_nmi(unsigned 
 extern void release_evntsel_nmi(unsigned int);
 
 extern void setup_apic_nmi_watchdog (void *);
-extern int reserve_lapic_nmi(void);
-extern void release_lapic_nmi(void);
 extern void disable_timer_nmi_watchdog(void);
 extern void enable_timer_nmi_watchdog(void);
 extern int nmi_watchdog_tick (struct pt_regs * regs, unsigned reason);
Index: linux/arch/i386/oprofile/nmi_int.c
===================================================================
--- linux.orig/arch/i386/oprofile/nmi_int.c
+++ linux/arch/i386/oprofile/nmi_int.c
@@ -17,14 +17,15 @@
 #include <asm/nmi.h>
 #include <asm/msr.h>
 #include <asm/apic.h>
+#include <asm/kdebug.h>
  
 #include "op_counter.h"
 #include "op_x86_model.h"
- 
+
 static struct op_x86_model_spec const * model;
 static struct op_msrs cpu_msrs[NR_CPUS];
 static unsigned long saved_lvtpc[NR_CPUS];
- 
+
 static int nmi_start(void);
 static void nmi_stop(void);
 
@@ -82,13 +83,24 @@ static void exit_driverfs(void)
 #define exit_driverfs() do { } while (0)
 #endif /* CONFIG_PM */
 
-
-static int nmi_callback(struct pt_regs * regs, int cpu)
+int profile_exceptions_notify(struct notifier_block *self,
+				unsigned long val, void *data)
 {
-	return model->check_ctrs(regs, &cpu_msrs[cpu]);
+	struct die_args *args = (struct die_args *)data;
+	int ret = NOTIFY_DONE;
+	int cpu = smp_processor_id();
+
+	switch(val) {
+	case DIE_NMI:
+		if (model->check_ctrs(args->regs, &cpu_msrs[cpu]))
+			ret = NOTIFY_STOP;
+		break;
+	default:
+		break;
+	}
+	return ret;
 }
- 
- 
+
 static void nmi_cpu_save_registers(struct op_msrs * msrs)
 {
 	unsigned int const nr_ctrs = model->num_counters;
@@ -174,27 +186,29 @@ static void nmi_cpu_setup(void * dummy)
 	apic_write(APIC_LVTPC, APIC_DM_NMI);
 }
 
+static struct notifier_block profile_exceptions_nb = {
+	.notifier_call = profile_exceptions_notify,
+	.next = NULL,
+	.priority = 0
+};
 
 static int nmi_setup(void)
 {
+	int err=0;
+
 	if (!allocate_msrs())
 		return -ENOMEM;
 
-	/* We walk a thin line between law and rape here.
-	 * We need to be careful to install our NMI handler
-	 * without actually triggering any NMIs as this will
-	 * break the core code horrifically.
-	 */
-	if (reserve_lapic_nmi() < 0) {
+	if ((err = register_die_notifier(&profile_exceptions_nb))){
 		free_msrs();
-		return -EBUSY;
+		return err;
 	}
+
 	/* We need to serialize save and setup for HT because the subset
 	 * of msrs are distinct for save and setup operations
 	 */
 	on_each_cpu(nmi_save_registers, NULL, 0, 1);
 	on_each_cpu(nmi_cpu_setup, NULL, 0, 1);
-	set_nmi_callback(nmi_callback);
 	nmi_enabled = 1;
 	return 0;
 }
@@ -250,8 +264,7 @@ static void nmi_shutdown(void)
 {
 	nmi_enabled = 0;
 	on_each_cpu(nmi_cpu_shutdown, NULL, 0, 1);
-	unset_nmi_callback();
-	release_lapic_nmi();
+	unregister_die_notifier(&profile_exceptions_nb);
 	free_msrs();
 }
 
Index: linux/arch/i386/oprofile/nmi_timer_int.c
===================================================================
--- linux.orig/arch/i386/oprofile/nmi_timer_int.c
+++ linux/arch/i386/oprofile/nmi_timer_int.c
@@ -17,32 +17,49 @@
 #include <asm/nmi.h>
 #include <asm/apic.h>
 #include <asm/ptrace.h>
+#include <asm/kdebug.h>
  
-static int nmi_timer_callback(struct pt_regs * regs, int cpu)
+int profile_timer_exceptions_notify(struct notifier_block *self,
+				unsigned long val, void *data)
 {
-	oprofile_add_sample(regs, 0);
-	return 1;
+	struct die_args *args = (struct die_args *)data;
+	int ret = NOTIFY_DONE;
+
+	switch(val) {
+	case DIE_NMI:
+		oprofile_add_sample(args->regs, 0);
+		ret = NOTIFY_STOP;
+		break;
+	default:
+		break;
+	}
+	return ret;
 }
 
+static struct notifier_block profile_timer_exceptions_nb = {
+	.notifier_call = profile_timer_exceptions_notify,
+	.next = NULL,
+	.priority = 0
+};
+
 static int timer_start(void)
 {
-	disable_timer_nmi_watchdog();
-	set_nmi_callback(nmi_timer_callback);
+	if (register_die_notifier(&profile_timer_exceptions_nb))
+		return 1;
 	return 0;
 }
 
 
 static void timer_stop(void)
 {
-	enable_timer_nmi_watchdog();
-	unset_nmi_callback();
+	unregister_die_notifier(&profile_timer_exceptions_nb);
 	synchronize_sched();  /* Allow already-started NMIs to complete. */
 }
 
 
 int __init op_nmi_timer_init(struct oprofile_operations * ops)
 {
-	if (atomic_read(&nmi_active) <= 0)
+	if ((nmi_watchdog != NMI_IO_APIC) || (atomic_read(&nmi_active) <= 0))
 		return -ENODEV;
 
 	ops->start = timer_start;
Index: linux/arch/i386/kernel/nmi.c
===================================================================
--- linux.orig/arch/i386/kernel/nmi.c
+++ linux/arch/i386/kernel/nmi.c
@@ -42,20 +42,6 @@ static DEFINE_PER_CPU(unsigned long, evn
  */
 #define NMI_MAX_COUNTER_BITS 66
 
-/*
- * lapic_nmi_owner tracks the ownership of the lapic NMI hardware:
- * - it may be reserved by some other driver, or not
- * - when not reserved by some other driver, it may be used for
- *   the NMI watchdog, or not
- *
- * This is maintained separately from nmi_active because the NMI
- * watchdog may also be driven from the I/O APIC timer.
- */
-static DEFINE_SPINLOCK(lapic_nmi_owner_lock);
-static unsigned int lapic_nmi_owner;
-#define LAPIC_NMI_WATCHDOG	(1<<0)
-#define LAPIC_NMI_RESERVED	(1<<1)
-
 /* nmi_active:
  * >0: the lapic NMI watchdog is active, but can be disabled
  * <0: the lapic NMI watchdog has not been set up, and cannot
@@ -325,33 +311,6 @@ static void enable_lapic_nmi_watchdog(vo
 	touch_nmi_watchdog();
 }
 
-int reserve_lapic_nmi(void)
-{
-	unsigned int old_owner;
-
-	spin_lock(&lapic_nmi_owner_lock);
-	old_owner = lapic_nmi_owner;
-	lapic_nmi_owner |= LAPIC_NMI_RESERVED;
-	spin_unlock(&lapic_nmi_owner_lock);
-	if (old_owner & LAPIC_NMI_RESERVED)
-		return -EBUSY;
-	if (old_owner & LAPIC_NMI_WATCHDOG)
-		disable_lapic_nmi_watchdog();
-	return 0;
-}
-
-void release_lapic_nmi(void)
-{
-	unsigned int new_owner;
-
-	spin_lock(&lapic_nmi_owner_lock);
-	new_owner = lapic_nmi_owner & ~LAPIC_NMI_RESERVED;
-	lapic_nmi_owner = new_owner;
-	spin_unlock(&lapic_nmi_owner_lock);
-	if (new_owner & LAPIC_NMI_WATCHDOG)
-		enable_lapic_nmi_watchdog();
-}
-
 void disable_timer_nmi_watchdog(void)
 {
 	BUG_ON(nmi_watchdog != NMI_IO_APIC);
@@ -866,6 +825,15 @@ done:
 	return rc;
 }
 
+int do_nmi_callback(struct pt_regs * regs, int cpu)
+{
+#ifdef CONFIG_SYSCTL
+	if (unknown_nmi_panic)
+		return unknown_nmi_panic_callback(regs, cpu);
+#endif
+	return 0;
+}
+
 #ifdef CONFIG_SYSCTL
 
 static int unknown_nmi_panic_callback(struct pt_regs *regs, int cpu)
@@ -873,37 +841,8 @@ static int unknown_nmi_panic_callback(st
 	unsigned char reason = get_nmi_reason();
 	char buf[64];
 
-	if (!(reason & 0xc0)) {
-		sprintf(buf, "NMI received for unknown reason %02x\n", reason);
-		die_nmi(regs, buf);
-	}
-	return 0;
-}
-
-/*
- * proc handler for /proc/sys/kernel/unknown_nmi_panic
- */
-int proc_unknown_nmi_panic(ctl_table *table, int write, struct file *file,
-			void __user *buffer, size_t *length, loff_t *ppos)
-{
-	int old_state;
-
-	old_state = unknown_nmi_panic;
-	proc_dointvec(table, write, file, buffer, length, ppos);
-	if (!!old_state == !!unknown_nmi_panic)
-		return 0;
-
-	if (unknown_nmi_panic) {
-		if (reserve_lapic_nmi() < 0) {
-			unknown_nmi_panic = 0;
-			return -EBUSY;
-		} else {
-			set_nmi_callback(unknown_nmi_panic_callback);
-		}
-	} else {
-		release_lapic_nmi();
-		unset_nmi_callback();
-	}
+	sprintf(buf, "NMI received for unknown reason %02x\n", reason);
+	die_nmi(regs, buf);
 	return 0;
 }
 
@@ -917,7 +856,5 @@ EXPORT_SYMBOL(reserve_perfctr_nmi);
 EXPORT_SYMBOL(release_perfctr_nmi);
 EXPORT_SYMBOL(reserve_evntsel_nmi);
 EXPORT_SYMBOL(release_evntsel_nmi);
-EXPORT_SYMBOL(reserve_lapic_nmi);
-EXPORT_SYMBOL(release_lapic_nmi);
 EXPORT_SYMBOL(disable_timer_nmi_watchdog);
 EXPORT_SYMBOL(enable_timer_nmi_watchdog);
Index: linux/arch/i386/kernel/traps.c
===================================================================
--- linux.orig/arch/i386/kernel/traps.c
+++ linux/arch/i386/kernel/traps.c
@@ -703,13 +703,6 @@ void die_nmi (struct pt_regs *regs, cons
 	do_exit(SIGSEGV);
 }
 
-static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
-{
-	return 0;
-}
-
-static nmi_callback_t nmi_callback = dummy_nmi_callback;
-
 static void default_do_nmi(struct pt_regs * regs)
 {
 	unsigned char reason = 0;
@@ -729,9 +722,10 @@ static void default_do_nmi(struct pt_reg
 		 */
 		if (nmi_watchdog_tick(regs, reason))
 			return;
+		if (!do_nmi_callback(regs, smp_processor_id()))
 #endif
-		if (!rcu_dereference(nmi_callback)(regs, smp_processor_id()))
 			unknown_nmi_error(reason, regs);
+
 		return;
 	}
 	if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
@@ -762,19 +756,6 @@ fastcall void do_nmi(struct pt_regs * re
 	nmi_exit();
 }
 
-void set_nmi_callback(nmi_callback_t callback)
-{
-	vmalloc_sync_all();
-	rcu_assign_pointer(nmi_callback, callback);
-}
-EXPORT_SYMBOL_GPL(set_nmi_callback);
-
-void unset_nmi_callback(void)
-{
-	nmi_callback = dummy_nmi_callback;
-}
-EXPORT_SYMBOL_GPL(unset_nmi_callback);
-
 #ifdef CONFIG_KPROBES
 fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
 {
Index: linux/include/asm-i386/nmi.h
===================================================================
--- linux.orig/include/asm-i386/nmi.h
+++ linux/include/asm-i386/nmi.h
@@ -6,24 +6,13 @@
 
 #include <linux/pm.h>
 
-struct pt_regs;
-
-typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu);
-
-/**
- * set_nmi_callback
- *
- * Set a handler for an NMI. Only one handler may be
- * set. Return 1 if the NMI was handled.
- */
-void set_nmi_callback(nmi_callback_t callback);
-
 /**
- * unset_nmi_callback
+ * do_nmi_callback
  *
- * Remove the handler previously set.
+ * Check to see if a callback exists and execute it.  Return 1
+ * if the handler exists and was handled successfully.
  */
-void unset_nmi_callback(void);
+int do_nmi_callback(struct pt_regs *regs, int cpu);
 
 extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
 extern int avail_to_resrv_perfctr_nmi(unsigned int);
@@ -33,8 +22,6 @@ extern int reserve_evntsel_nmi(unsigned 
 extern void release_evntsel_nmi(unsigned int);
 
 extern void setup_apic_nmi_watchdog (void *);
-extern int reserve_lapic_nmi(void);
-extern void release_lapic_nmi(void);
 extern void disable_timer_nmi_watchdog(void);
 extern void enable_timer_nmi_watchdog(void);
 extern int nmi_watchdog_tick (struct pt_regs * regs, unsigned reason);
Index: linux/kernel/sysctl.c
===================================================================
--- linux.orig/kernel/sysctl.c
+++ linux/kernel/sysctl.c
@@ -76,8 +76,6 @@ extern int compat_log;
 
 #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
 int unknown_nmi_panic;
-extern int proc_unknown_nmi_panic(ctl_table *, int, struct file *,
-				  void __user *, size_t *, loff_t *);
 #endif
 
 /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
@@ -628,7 +626,7 @@ static ctl_table kern_table[] = {
 		.data           = &unknown_nmi_panic,
 		.maxlen         = sizeof (int),
 		.mode           = 0644,
-		.proc_handler   = &proc_unknown_nmi_panic,
+		.proc_handler   = &proc_dointvec,
 	},
 #endif
 #if defined(CONFIG_X86)
Index: linux/arch/i386/kernel/crash.c
===================================================================
--- linux.orig/arch/i386/kernel/crash.c
+++ linux/arch/i386/kernel/crash.c
@@ -22,6 +22,8 @@
 #include <asm/nmi.h>
 #include <asm/hw_irq.h>
 #include <asm/apic.h>
+#include <asm/kdebug.h>
+
 #include <mach_ipi.h>
 
 
@@ -93,9 +95,18 @@ static void crash_save_self(struct pt_re
 #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 static atomic_t waiting_for_crash_ipi;
 
-static int crash_nmi_callback(struct pt_regs *regs, int cpu)
+static int crash_nmi_callback(struct notifier_block *self,
+			unsigned long val, void *data)
 {
+	struct pt_regs *regs;
 	struct pt_regs fixed_regs;
+	int cpu;
+
+	if (val != DIE_NMI)
+		return NOTIFY_OK;
+
+	regs = ((struct die_args *)data)->regs;
+	cpu = raw_smp_processor_id();
 
 	/* Don't do anything if this handler is invoked on crashing cpu.
 	 * Otherwise, system will completely hang. Crashing cpu can get
@@ -125,13 +136,18 @@ static void smp_send_nmi_allbutself(void
 	send_IPI_allbutself(NMI_VECTOR);
 }
 
+static struct notifier_block crash_nmi_nb = {
+	.notifier_call = crash_nmi_callback,
+};
+
 static void nmi_shootdown_cpus(void)
 {
 	unsigned long msecs;
 
 	atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
 	/* Would it be better to replace the trap vector here? */
-	set_nmi_callback(crash_nmi_callback);
+	if (register_die_notifier(&crash_nmi_nb))
+		return;		/* return what? */
 	/* Ensure the new callback function is set before sending
 	 * out the NMI
 	 */
Index: linux/arch/x86_64/kernel/crash.c
===================================================================
--- linux.orig/arch/x86_64/kernel/crash.c
+++ linux/arch/x86_64/kernel/crash.c
@@ -23,6 +23,7 @@
 #include <asm/nmi.h>
 #include <asm/hw_irq.h>
 #include <asm/mach_apic.h>
+#include <asm/kdebug.h>
 
 /* This keeps a track of which one is crashing cpu. */
 static int crashing_cpu;
@@ -95,8 +96,18 @@ static void crash_save_self(struct pt_re
 #ifdef CONFIG_SMP
 static atomic_t waiting_for_crash_ipi;
 
-static int crash_nmi_callback(struct pt_regs *regs, int cpu)
+static int crash_nmi_callback(struct notifier_block *self,
+				unsigned long val, void *data)
 {
+	struct pt_regs *regs;
+	int cpu;
+
+	if (val != DIE_NMI)
+		return NOTIFY_OK;
+
+	regs = ((struct die_args *)data)->regs;
+	cpu = raw_smp_processor_id();
+
 	/*
 	 * Don't do anything if this handler is invoked on crashing cpu.
 	 * Otherwise, system will completely hang. Crashing cpu can get
@@ -127,12 +138,17 @@ static void smp_send_nmi_allbutself(void
  * cpu hotplug shouldn't matter.
  */
 
+static struct notifier_block crash_nmi_nb = {
+	.notifier_call = crash_nmi_callback,
+};
+
 static void nmi_shootdown_cpus(void)
 {
 	unsigned long msecs;
 
 	atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
-	set_nmi_callback(crash_nmi_callback);
+	if (register_die_notifier(&crash_nmi_nb))
+		return;         /* return what? */
 
 	/*
 	 * Ensure the new callback function is set before sending

  parent reply	other threads:[~2006-08-10 20:14 UTC|newest]

Thread overview: 195+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20060810 935.775038000@suse.de>
2006-08-10 19:35 ` [PATCH for review] [1/145] x86_64: Update defconfig Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [2/145] i386: " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [3/145] i386: Allow to use GENERICARCH for UP kernels Andi Kleen
2006-08-10 19:47   ` Dave Hansen
2006-08-10 19:50     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [4/145] x86_64: Temporarily revert parts of the Core 2 nmi nmi watchdog support Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [5/145] x86_64: Add performance counter reservation framework for UP kernels Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [6/145] x86_64: Utilize performance counter reservation framework in oprofile Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [7/145] x86_64: Add SMP support on x86_64 to reservation framework Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [8/145] x86_64: Add SMP support on i386 " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [9/145] x86_64: Cleanup NMI interrupt path Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [10/145] x86_64: Add TIF_RESTORE_SIGMASK Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [11/145] x86_64: Add ppoll/pselect syscalls Andi Kleen
2006-08-10 19:35 ` Andi Kleen [this message]
2006-08-10 19:35 ` [PATCH for review] [13/145] x86_64: Add abilty to enable/disable nmi watchdog with sysctl Andi Kleen
2006-08-10 19:48   ` Oleg Verych
2006-08-11  6:44     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [14/145] x86_64: Add abilty to enable/disable nmi watchdog from procfs (update) Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [15/145] x86_64: Allow users to force a panic on NMI Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [16/145] x86_64: x86 clean up nmi panic messages Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [17/145] i386/x86-64: x86 nmi fix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [18/145] x86_64: x86 nmi fix 2 Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [19/145] x86_64: Fix up panic messages for different NMI panics Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [20/145] x86_64: make functions static Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [21/145] x86_64: kdump x86_64 nmi event notification fix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [22/145] x86_64: Kdump i386 " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [23/145] i386: Enable NMI watchdog by default Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [24/145] x86_64: i386/x86-64 Add nmi watchdog support for new Intel CPUs Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [25/145] x86_64: Add macros for rdtscp Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [26/145] x86_64: Add initalization of the RDTSCP auxilliary values Andi Kleen
2006-08-10 21:49   ` Oleg Verych
2006-08-11  4:09     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [27/145] x86_64: Add the vgetcpu vsyscall Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [28/145] x86_64: Add portable getcpu call Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [29/145] x86_64: Clean up asm/smp.h includes Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [30/145] x86_64: x86-64 TIF flags for debug regs and io bitmap in ctxsw Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [31/145] x86_64: Don't print virtual address in HPET initialization Andi Kleen
2006-08-11 16:50   ` Clemens Ladisch
2006-08-10 19:35 ` [PATCH for review] [32/145] x86_64: A few trivial spelling and grammar fixes Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [33/145] i386/x86-64: Don't randomize stack top when no randomization personality is set Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [34/145] i386: Account spinlocks to the caller during profiling for !FP kernels Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [35/145] x86_64: Simplify profile_pc on x86-64 Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [36/145] x86_64: Document backtracer selection options Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [37/145] x86_64: Support patchable lock prefix for pure assembly files Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [38/145] x86_64: Switch rwlocks over to patchable lock prefix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [39/145] x86_64: Clean up read write lock assembly Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [40/145] i386: Remove const case for rwlocks Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [41/145] x86_64: Add proper alignment to ENTRY Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [42/145] i386: add alternative-asm.h to allow LOCK_PREFIX replacement in .S files Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [43/145] i386: Redo semaphore and rwlock assembly helpers Andi Kleen
2006-08-13  0:53   ` Andrew Morton
2006-08-13  6:50     ` Andi Kleen
2006-08-13  6:54       ` Andrew Morton
2006-08-13  7:42         ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [44/145] x86_64: Remove leftover CVS Id in thunk.S Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [45/145] x86_64: Add some comments what tce.c actually does Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [46/145] x86_64: Remove all ifdefs for local/io apic Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [47/145] x86_64: Remove apic mismatch counter Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [48/145] x86_64: Remove old "focus disabled" chipset errata workaround Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [49/145] x86_64: Clean up and minor fixes to TLB flush Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [50/145] i386: Minor fixes & cleanup to tlb flush Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [51/145] x86_64: Add some comments to entry.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [52/145] x86_64: Remove pirq overwrite support Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [53/145] x86_64: Remove leftover MCE/EISA support Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [54/145] x86_64: Remove obsolete PIC mode Andi Kleen
2006-08-16 16:31   ` Len Brown
2006-08-16 16:35     ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [55/145] i386/x86-64: Remove obsolete sanity check in mptable parsing Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [56/145] x86_64: Factor out common io apic routing entry access Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [57/145] i386: " Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [58/145] x86_64: AUX_DEVICE_INFO is one byte long, use 'movb' Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [59/145] x86_64: Remove MPS table APIC renumbering Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [60/145] x86_64: Move early chipset quirks out to new file Andi Kleen
2006-08-16 15:36   ` Len Brown
2006-08-10 19:36 ` [PATCH for review] [61/145] x86_64: Replace mp bus array with bitmap for bus not pci Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [62/145] x86_64: Remove useless wrapper in mpparse.c code Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [63/145] x86_64: Remove some unneeded ACPI externs in mpparse.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [64/145] x86_64: Fix up some non linuxy style in ACPI functions " Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [65/145] i386: Clean up code style in mpparse.c ACPI code Andi Kleen
2006-08-16 16:08   ` Len Brown
2006-08-16 16:30     ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [66/145] x86_64: Use BUILD_BUG_ON in apic.c build sanity checking Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [67/145] x86_64: Detect CFI support in the assembler at runtime Andi Kleen
     [not found]   ` <20060811053932.GA4910@mars.ravnborg.org>
2006-08-11  5:55     ` Andi Kleen
2006-08-11 15:16       ` Sam Ravnborg
2006-08-11 16:10         ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [68/145] x86_64: Remove obsolete CVS $ from assembler files in arch/x86_64/kernel/* Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [69/145] x86_64: Disable DAC on VIA PCI bridges Andi Kleen
     [not found]   ` <20060810205554.GE4745@rhun.haifa.ibm.com>
2006-08-11  6:51     ` Andi Kleen
2006-08-11 19:13       ` Muli Ben-Yehuda
2006-08-11 19:36         ` Andi Kleen
2006-08-11 19:41           ` Muli Ben-Yehuda
2006-08-10 19:36 ` [PATCH for review] [70/145] x86_64: initialize end of memory variables as early as possible Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [71/145] x86_64: remove int_delivery_dest Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [72/145] i386: initialize end-of-memory variables as early as possible Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [73/145] x86_64: Add stack documentation document from Keith Owens Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [74/145] x86_64: Calgary IOMMU: rearrange 'struct iommu_table' members Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [75/145] x86_64: Calgary IOMMU: consolidate per bus data structures Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [76/145] x86_64: Calgary IOMMU: break out of pci_find_device_reverse if dev not found Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [77/145] x86_64: Calgary IOMMU: fix error path memleak in calgary_free_tar Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [78/145] x86_64: Calgary IOMMU: fix reference counting of Calgary PCI devices Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [79/145] x86_64: Calgary IOMMU: calgary_init_one_nontraslated() can return void Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [80/145] x86_64: Calgary IOMMU: save a bit of space in bus_info Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [81/145] i386: Remove lock section support in mutex.h, semaphore.h Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [82/145] x86_64: Don't use lock section for mutexes and semaphores Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [83/145] x86_64: fix is_at_popf() for compat tasks Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [84/145] x86_64: annotate arch/x86_64/lib/*.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [85/145] x86_64: Fix gdt table size in trampoline.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [86/145] x86_64: remove superflous BUG_ON's in nommu and gart Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [87/145] x86_64: remove lock prefix from is_at_popf() tests Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [88/145] x86_64: Use early CPU identify before early command line parsing Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [89/145] x86_64: Allow early_param and identical __setup to exist Andi Kleen
2006-08-16 16:25   ` Len Brown
2006-08-10 19:36 ` [PATCH for review] [90/145] x86_64: Replace i386 open-coded cmdline parsing with Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [91/145] x86_64: Convert x86-64 to early param Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [92/145] x86_64: Remove need for early lockdep init Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [93/145] i386/x86-64: Move acpi_disabled variables into acpi/boot.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [94/145] x86_64: Clean up acpi_numa variable Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [95/145] x86_64: Move e820 map into e820.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [96/145] x86_64: Add sparse annotation to vsyscall.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [97/145] x86_64: Add sparse annotations to quiet sparse in arch/x86_64/mm/fault.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [98/145] x86_64: Fix most sparse warnings in sys_ia32.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [99/145] x86_64: Fix sparse warnings in compat aout code Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [100/145] x86_64: Fix broken indentation in iommu_setup Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [101/145] x86_64: Replace local_save_flags+local_irq_disable with Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [102/145] x86_64: Remove unneeded externs in acpi/boot.c Andi Kleen
2006-08-16 15:41   ` Len Brown
2006-08-10 19:37 ` [PATCH for review] [103/145] i386/x86-64: rename is_at_popf(), add iret to tests and fix Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [104/145] x86_64: print whether CONFIG_IOMMU_DEBUG is enabled Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [105/145] x86_64: only verify the allocation bitmap if CONFIG_IOMMU_DEBUG is on Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [106/145] x86_64: remove tce_cache_blast_stress() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [107/145] x86_64: Calgary IOMMU: eradicate sole remaining 80 chars per line offender Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [108/145] x86_64: Some preparationary cleanup for stack trace Andi Kleen
2006-08-13  6:26   ` Andrew Morton
2006-08-13  6:53     ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [109/145] x86_64: Convert modlist_lock to be a raw spinlock Andi Kleen
2006-08-13  5:48   ` Andrew Morton
2006-08-13  6:52     ` Andi Kleen
2006-08-13  7:02       ` Andrew Morton
2006-08-13  7:15         ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [110/145] x86_64: Don't access the APIC in safe_smp_processor_id when it is not mapped yet Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [111/145] x86_64: Move unwind_init earlier Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [112/145] x86_64: Merge stacktrace and show_trace Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [113/145] i386: Do stacktracer conversion too Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [114/145] x86_64: Don't force frame pointers for lockdep Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [115/145] x86_64: fix dubious segment register clear in cpu_init() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [116/145] i386: don't taint UP K7's running SMP kernels Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [117/145] i386: error_code is not safe for kprobes Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [118/145] x86_64: Mark error_entry as forbidden to kprobes Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [119/145] x86_64: X86_64 monotonic_clock goes backwards Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [120/145] i386/x86-64: Improve Kconfig description of CRASH_DUMP Andi Kleen
2006-08-10 21:12   ` Randy.Dunlap
2006-08-10 19:37 ` [PATCH for review] [121/145] x86_64: Make boot_param_data pure BSS Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [122/145] i386: Fix warning in mpparse.c Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [123/145] i386: make fault notifier unconditional and export it Andi Kleen
2006-08-13 15:28   ` Adrian Bunk
2006-08-13 17:11     ` Alan Cox
2006-08-13 17:08       ` Adrian Bunk
2006-08-13 18:04         ` Alan Cox
2006-08-13 20:17     ` Andi Kleen
2006-08-14  0:03       ` Keith Owens
2006-08-10 19:37 ` [PATCH for review] [124/145] " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [125/145] i376: Make acpi_force static Andi Kleen
2006-08-16 15:47   ` Len Brown
2006-08-16 16:07     ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [126/145] i386: Make enable_local_apic static Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [127/145] i386: move kernel_thread_helper into entry.S Andi Kleen
2006-08-11  8:33   ` Jan Beulich
2006-08-11  8:38     ` Andi Kleen
2006-08-11  9:48       ` Jan Beulich
2006-08-11 10:16         ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [128/145] i386: Descriptor and trap table cleanups Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [129/145] x86_64: Auto size the per cpu area Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [130/145] i386: clean up topology.c Andi Kleen
2006-08-10 19:50   ` Dave Hansen
2006-08-10 19:55     ` Andi Kleen
2006-08-11  1:32     ` Magnus Damm
2006-08-10 19:37 ` [PATCH for review] [131/145] i386: mark two more functions as __init Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [132/145] x86_64: fix bus numbering format in mmconfig warning Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [133/145] x86_64: Support physical cpu hotplug for x86_64 Andi Kleen
     [not found]   ` <20060810222056.GA24184@mail.muni.cz>
2006-08-11  4:05     ` Andi Kleen
2006-08-16 16:02   ` Len Brown
2006-08-10 19:37 ` [PATCH for review] [134/145] x86_64: non lazy "sleazy" fpu implementation Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [135/145] x86_64: wire up oops_enter()/oops_exit() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [136/145] x86_64: x86_64 kernel mapping fix Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [137/145] i386: KPROBE_ENTRY ends up putting code into .fixup Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [138/145] i386: remove redundant generic_identify() calls when identifying cpus Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [139/145] x86_64: mark init_amd() as __cpuinit Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [140/145] i386: mark cpu_dev structures as __cpuinitdata Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [141/145] i386: mark cpu init functions as __cpuinit, data " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [142/145] i386: mark cpu identify functions as __cpuinit Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [143/145] i386: mark cpu cache " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [144/145] i386: Disallow kprobes on NMI handlers Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [145/145] " Andi Kleen
     [not found] ` <20060810193518.394E413B90__40006.6926530146$1155241071$gmane$org@wotan.suse.de>
2006-08-10 22:42   ` [PATCH for review] [6/145] x86_64: Utilize performance counter reservation framework in oprofile Oleg Verych

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=20060810193524.A7CFA13C23@wotan.suse.de \
    --to=ak@suse.de \
    /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

all inboxes | Powered by JetHome®