x86 kdump: extract kdump-specific code from crash_nmi_callback()
authorEduardo Habkost <ehabkost@redhat.com>
Wed, 12 Nov 2008 13:34:37 +0000 (11:34 -0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 12 Nov 2008 17:55:43 +0000 (18:55 +0100)
Impact: cleanup

The NMI CPU-halting code will be used on non-kdump cases, also
(e.g. emergency_reboot when virtualization is enabled).

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/crash.c

index 2685538179097a1e8e073ebf07cd49e898ef4f6e..60475422a51a36f8ac04bed3eaca932a187ba2a3 100644 (file)
@@ -35,19 +35,34 @@ static int crashing_cpu;
 #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 static atomic_t waiting_for_crash_ipi;
 
-static int crash_nmi_callback(struct notifier_block *self,
-                       unsigned long val, void *data)
+static void kdump_nmi_callback(int cpu, struct die_args *args)
 {
        struct pt_regs *regs;
 #ifdef CONFIG_X86_32
        struct pt_regs fixed_regs;
 #endif
+
+       regs = args->regs;
+
+#ifdef CONFIG_X86_32
+       if (!user_mode_vm(regs)) {
+               crash_fixup_ss_esp(&fixed_regs, regs);
+               regs = &fixed_regs;
+       }
+#endif
+       crash_save_cpu(regs, cpu);
+
+       disable_local_APIC();
+}
+
+static int crash_nmi_callback(struct notifier_block *self,
+                       unsigned long val, void *data)
+{
        int cpu;
 
        if (val != DIE_NMI_IPI)
                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.
@@ -58,14 +73,8 @@ static int crash_nmi_callback(struct notifier_block *self,
                return NOTIFY_STOP;
        local_irq_disable();
 
-#ifdef CONFIG_X86_32
-       if (!user_mode_vm(regs)) {
-               crash_fixup_ss_esp(&fixed_regs, regs);
-               regs = &fixed_regs;
-       }
-#endif
-       crash_save_cpu(regs, cpu);
-       disable_local_APIC();
+       kdump_nmi_callback(cpu, (struct die_args *)data);
+
        atomic_dec(&waiting_for_crash_ipi);
        /* Assume hlt works */
        halt();