diff options
Diffstat (limited to 'drivers/acpi/apei/ghes.c')
-rw-r--r-- | drivers/acpi/apei/ghes.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 0784f99a4665..b8e08cb67a18 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <acpi/hed.h> | 50 | #include <acpi/hed.h> |
51 | #include <asm/mce.h> | 51 | #include <asm/mce.h> |
52 | #include <asm/tlbflush.h> | 52 | #include <asm/tlbflush.h> |
53 | #include <asm/nmi.h> | ||
53 | 54 | ||
54 | #include "apei-internal.h" | 55 | #include "apei-internal.h" |
55 | 56 | ||
@@ -749,15 +750,11 @@ static void ghes_proc_in_irq(struct irq_work *irq_work) | |||
749 | } | 750 | } |
750 | } | 751 | } |
751 | 752 | ||
752 | static int ghes_notify_nmi(struct notifier_block *this, | 753 | static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) |
753 | unsigned long cmd, void *data) | ||
754 | { | 754 | { |
755 | struct ghes *ghes, *ghes_global = NULL; | 755 | struct ghes *ghes, *ghes_global = NULL; |
756 | int sev, sev_global = -1; | 756 | int sev, sev_global = -1; |
757 | int ret = NOTIFY_DONE; | 757 | int ret = NMI_DONE; |
758 | |||
759 | if (cmd != DIE_NMI) | ||
760 | return ret; | ||
761 | 758 | ||
762 | raw_spin_lock(&ghes_nmi_lock); | 759 | raw_spin_lock(&ghes_nmi_lock); |
763 | list_for_each_entry_rcu(ghes, &ghes_nmi, list) { | 760 | list_for_each_entry_rcu(ghes, &ghes_nmi, list) { |
@@ -770,10 +767,10 @@ static int ghes_notify_nmi(struct notifier_block *this, | |||
770 | sev_global = sev; | 767 | sev_global = sev; |
771 | ghes_global = ghes; | 768 | ghes_global = ghes; |
772 | } | 769 | } |
773 | ret = NOTIFY_STOP; | 770 | ret = NMI_HANDLED; |
774 | } | 771 | } |
775 | 772 | ||
776 | if (ret == NOTIFY_DONE) | 773 | if (ret == NMI_DONE) |
777 | goto out; | 774 | goto out; |
778 | 775 | ||
779 | if (sev_global >= GHES_SEV_PANIC) { | 776 | if (sev_global >= GHES_SEV_PANIC) { |
@@ -825,10 +822,6 @@ static struct notifier_block ghes_notifier_sci = { | |||
825 | .notifier_call = ghes_notify_sci, | 822 | .notifier_call = ghes_notify_sci, |
826 | }; | 823 | }; |
827 | 824 | ||
828 | static struct notifier_block ghes_notifier_nmi = { | ||
829 | .notifier_call = ghes_notify_nmi, | ||
830 | }; | ||
831 | |||
832 | static unsigned long ghes_esource_prealloc_size( | 825 | static unsigned long ghes_esource_prealloc_size( |
833 | const struct acpi_hest_generic *generic) | 826 | const struct acpi_hest_generic *generic) |
834 | { | 827 | { |
@@ -918,7 +911,8 @@ static int __devinit ghes_probe(struct platform_device *ghes_dev) | |||
918 | ghes_estatus_pool_expand(len); | 911 | ghes_estatus_pool_expand(len); |
919 | mutex_lock(&ghes_list_mutex); | 912 | mutex_lock(&ghes_list_mutex); |
920 | if (list_empty(&ghes_nmi)) | 913 | if (list_empty(&ghes_nmi)) |
921 | register_die_notifier(&ghes_notifier_nmi); | 914 | register_nmi_handler(NMI_LOCAL, ghes_notify_nmi, 0, |
915 | "ghes"); | ||
922 | list_add_rcu(&ghes->list, &ghes_nmi); | 916 | list_add_rcu(&ghes->list, &ghes_nmi); |
923 | mutex_unlock(&ghes_list_mutex); | 917 | mutex_unlock(&ghes_list_mutex); |
924 | break; | 918 | break; |
@@ -964,7 +958,7 @@ static int __devexit ghes_remove(struct platform_device *ghes_dev) | |||
964 | mutex_lock(&ghes_list_mutex); | 958 | mutex_lock(&ghes_list_mutex); |
965 | list_del_rcu(&ghes->list); | 959 | list_del_rcu(&ghes->list); |
966 | if (list_empty(&ghes_nmi)) | 960 | if (list_empty(&ghes_nmi)) |
967 | unregister_die_notifier(&ghes_notifier_nmi); | 961 | unregister_nmi_handler(NMI_LOCAL, "ghes"); |
968 | mutex_unlock(&ghes_list_mutex); | 962 | mutex_unlock(&ghes_list_mutex); |
969 | /* | 963 | /* |
970 | * To synchronize with NMI handler, ghes can only be | 964 | * To synchronize with NMI handler, ghes can only be |