diff options
author | Don Zickus <dzickus@redhat.com> | 2011-09-30 15:06:21 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-10-10 00:56:57 -0400 |
commit | 9c48f1c629ecfa114850c03f875c6691003214de (patch) | |
tree | 5e454da487c90fc8399ce366aa2437597c9ff5e5 /drivers/acpi/apei/ghes.c | |
parent | c9126b2ee8adb9235941cedbf558d39a9e65642d (diff) |
x86, nmi: Wire up NMI handlers to new routines
Just convert all the files that have an nmi handler to the new routines.
Most of it is straight forward conversion. A couple of places needed some
tweaking like kgdb which separates the debug notifier from the nmi handler
and mce removes a call to notify_die.
[Thanks to Ying for finding out the history behind that mce call
https://lkml.org/lkml/2010/5/27/114
And Boris responding that he would like to remove that call because of it
https://lkml.org/lkml/2011/9/21/163]
The things that get converted are the registeration/unregistration routines
and the nmi handler itself has its args changed along with code removal
to check which list it is on (most are on one NMI list except for kgdb
which has both an NMI routine and an NMI Unknown routine).
Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Corey Minyard <minyard@acm.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Huang Ying <ying.huang@intel.com>
Cc: Corey Minyard <minyard@acm.org>
Cc: Jack Steiner <steiner@sgi.com>
Link: http://lkml.kernel.org/r/1317409584-23662-4-git-send-email-dzickus@redhat.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
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 |