diff options
Diffstat (limited to 'arch/x86/kernel/reboot.c')
-rw-r--r-- | arch/x86/kernel/reboot.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 9242436e993..e334be1182b 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -464,7 +464,7 @@ static inline void kb_wait(void) | |||
464 | } | 464 | } |
465 | } | 465 | } |
466 | 466 | ||
467 | static void vmxoff_nmi(int cpu, struct die_args *args) | 467 | static void vmxoff_nmi(int cpu, struct pt_regs *regs) |
468 | { | 468 | { |
469 | cpu_emergency_vmxoff(); | 469 | cpu_emergency_vmxoff(); |
470 | } | 470 | } |
@@ -736,14 +736,10 @@ static nmi_shootdown_cb shootdown_callback; | |||
736 | 736 | ||
737 | static atomic_t waiting_for_crash_ipi; | 737 | static atomic_t waiting_for_crash_ipi; |
738 | 738 | ||
739 | static int crash_nmi_callback(struct notifier_block *self, | 739 | static int crash_nmi_callback(unsigned int val, struct pt_regs *regs) |
740 | unsigned long val, void *data) | ||
741 | { | 740 | { |
742 | int cpu; | 741 | int cpu; |
743 | 742 | ||
744 | if (val != DIE_NMI) | ||
745 | return NOTIFY_OK; | ||
746 | |||
747 | cpu = raw_smp_processor_id(); | 743 | cpu = raw_smp_processor_id(); |
748 | 744 | ||
749 | /* Don't do anything if this handler is invoked on crashing cpu. | 745 | /* Don't do anything if this handler is invoked on crashing cpu. |
@@ -751,10 +747,10 @@ static int crash_nmi_callback(struct notifier_block *self, | |||
751 | * an NMI if system was initially booted with nmi_watchdog parameter. | 747 | * an NMI if system was initially booted with nmi_watchdog parameter. |
752 | */ | 748 | */ |
753 | if (cpu == crashing_cpu) | 749 | if (cpu == crashing_cpu) |
754 | return NOTIFY_STOP; | 750 | return NMI_HANDLED; |
755 | local_irq_disable(); | 751 | local_irq_disable(); |
756 | 752 | ||
757 | shootdown_callback(cpu, (struct die_args *)data); | 753 | shootdown_callback(cpu, regs); |
758 | 754 | ||
759 | atomic_dec(&waiting_for_crash_ipi); | 755 | atomic_dec(&waiting_for_crash_ipi); |
760 | /* Assume hlt works */ | 756 | /* Assume hlt works */ |
@@ -762,7 +758,7 @@ static int crash_nmi_callback(struct notifier_block *self, | |||
762 | for (;;) | 758 | for (;;) |
763 | cpu_relax(); | 759 | cpu_relax(); |
764 | 760 | ||
765 | return 1; | 761 | return NMI_HANDLED; |
766 | } | 762 | } |
767 | 763 | ||
768 | static void smp_send_nmi_allbutself(void) | 764 | static void smp_send_nmi_allbutself(void) |
@@ -770,12 +766,6 @@ static void smp_send_nmi_allbutself(void) | |||
770 | apic->send_IPI_allbutself(NMI_VECTOR); | 766 | apic->send_IPI_allbutself(NMI_VECTOR); |
771 | } | 767 | } |
772 | 768 | ||
773 | static struct notifier_block crash_nmi_nb = { | ||
774 | .notifier_call = crash_nmi_callback, | ||
775 | /* we want to be the first one called */ | ||
776 | .priority = NMI_LOCAL_HIGH_PRIOR+1, | ||
777 | }; | ||
778 | |||
779 | /* Halt all other CPUs, calling the specified function on each of them | 769 | /* Halt all other CPUs, calling the specified function on each of them |
780 | * | 770 | * |
781 | * This function can be used to halt all other CPUs on crash | 771 | * This function can be used to halt all other CPUs on crash |
@@ -794,7 +784,8 @@ void nmi_shootdown_cpus(nmi_shootdown_cb callback) | |||
794 | 784 | ||
795 | atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); | 785 | atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); |
796 | /* Would it be better to replace the trap vector here? */ | 786 | /* Would it be better to replace the trap vector here? */ |
797 | if (register_die_notifier(&crash_nmi_nb)) | 787 | if (register_nmi_handler(NMI_LOCAL, crash_nmi_callback, |
788 | NMI_FLAG_FIRST, "crash")) | ||
798 | return; /* return what? */ | 789 | return; /* return what? */ |
799 | /* Ensure the new callback function is set before sending | 790 | /* Ensure the new callback function is set before sending |
800 | * out the NMI | 791 | * out the NMI |