Signed-off-by: Andrew Morton --- arch/i386/kernel/crash.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff -puN arch/i386/kernel/crash.c~x86_64-mm-x86_64-mm-remove-un-set_nmi_callback-and-reserve-release_lapic_nmi-functions-x86-fix arch/i386/kernel/crash.c --- devel/arch/i386/kernel/crash.c~x86_64-mm-x86_64-mm-remove-un-set_nmi_callback-and-reserve-release_lapic_nmi-functions-x86-fix 2006-06-09 15:17:33.000000000 -0700 +++ devel-akpm/arch/i386/kernel/crash.c 2006-06-09 15:17:33.000000000 -0700 @@ -22,6 +22,8 @@ #include #include #include +#include + #include @@ -93,9 +95,12 @@ 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 = ((struct die_args *)data)->regs; struct pt_regs fixed_regs; + int 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 @@ -129,13 +134,18 @@ static void smp_send_nmi_allbutself(void send_IPI_allbutself(APIC_DM_NMI); } +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 */ _