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 /arch/x86/oprofile | |
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 'arch/x86/oprofile')
-rw-r--r-- | arch/x86/oprofile/nmi_int.c | 38 | ||||
-rw-r--r-- | arch/x86/oprofile/nmi_timer_int.c | 28 |
2 files changed, 17 insertions, 49 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index 68894fdc034b..adf8fb31aa7b 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
@@ -61,26 +61,15 @@ u64 op_x86_get_ctrl(struct op_x86_model_spec const *model, | |||
61 | } | 61 | } |
62 | 62 | ||
63 | 63 | ||
64 | static int profile_exceptions_notify(struct notifier_block *self, | 64 | static int profile_exceptions_notify(unsigned int val, struct pt_regs *regs) |
65 | unsigned long val, void *data) | ||
66 | { | 65 | { |
67 | struct die_args *args = (struct die_args *)data; | 66 | if (ctr_running) |
68 | int ret = NOTIFY_DONE; | 67 | model->check_ctrs(regs, &__get_cpu_var(cpu_msrs)); |
69 | 68 | else if (!nmi_enabled) | |
70 | switch (val) { | 69 | return NMI_DONE; |
71 | case DIE_NMI: | 70 | else |
72 | if (ctr_running) | 71 | model->stop(&__get_cpu_var(cpu_msrs)); |
73 | model->check_ctrs(args->regs, &__get_cpu_var(cpu_msrs)); | 72 | return NMI_HANDLED; |
74 | else if (!nmi_enabled) | ||
75 | break; | ||
76 | else | ||
77 | model->stop(&__get_cpu_var(cpu_msrs)); | ||
78 | ret = NOTIFY_STOP; | ||
79 | break; | ||
80 | default: | ||
81 | break; | ||
82 | } | ||
83 | return ret; | ||
84 | } | 73 | } |
85 | 74 | ||
86 | static void nmi_cpu_save_registers(struct op_msrs *msrs) | 75 | static void nmi_cpu_save_registers(struct op_msrs *msrs) |
@@ -363,12 +352,6 @@ static void nmi_cpu_setup(void *dummy) | |||
363 | apic_write(APIC_LVTPC, APIC_DM_NMI); | 352 | apic_write(APIC_LVTPC, APIC_DM_NMI); |
364 | } | 353 | } |
365 | 354 | ||
366 | static struct notifier_block profile_exceptions_nb = { | ||
367 | .notifier_call = profile_exceptions_notify, | ||
368 | .next = NULL, | ||
369 | .priority = NMI_LOCAL_LOW_PRIOR, | ||
370 | }; | ||
371 | |||
372 | static void nmi_cpu_restore_registers(struct op_msrs *msrs) | 355 | static void nmi_cpu_restore_registers(struct op_msrs *msrs) |
373 | { | 356 | { |
374 | struct op_msr *counters = msrs->counters; | 357 | struct op_msr *counters = msrs->counters; |
@@ -508,7 +491,8 @@ static int nmi_setup(void) | |||
508 | ctr_running = 0; | 491 | ctr_running = 0; |
509 | /* make variables visible to the nmi handler: */ | 492 | /* make variables visible to the nmi handler: */ |
510 | smp_mb(); | 493 | smp_mb(); |
511 | err = register_die_notifier(&profile_exceptions_nb); | 494 | err = register_nmi_handler(NMI_LOCAL, profile_exceptions_notify, |
495 | 0, "oprofile"); | ||
512 | if (err) | 496 | if (err) |
513 | goto fail; | 497 | goto fail; |
514 | 498 | ||
@@ -538,7 +522,7 @@ static void nmi_shutdown(void) | |||
538 | put_online_cpus(); | 522 | put_online_cpus(); |
539 | /* make variables visible to the nmi handler: */ | 523 | /* make variables visible to the nmi handler: */ |
540 | smp_mb(); | 524 | smp_mb(); |
541 | unregister_die_notifier(&profile_exceptions_nb); | 525 | unregister_nmi_handler(NMI_LOCAL, "oprofile"); |
542 | msrs = &get_cpu_var(cpu_msrs); | 526 | msrs = &get_cpu_var(cpu_msrs); |
543 | model->shutdown(msrs); | 527 | model->shutdown(msrs); |
544 | free_msrs(); | 528 | free_msrs(); |
diff --git a/arch/x86/oprofile/nmi_timer_int.c b/arch/x86/oprofile/nmi_timer_int.c index 720bf5a53c51..7f8052cd6620 100644 --- a/arch/x86/oprofile/nmi_timer_int.c +++ b/arch/x86/oprofile/nmi_timer_int.c | |||
@@ -18,32 +18,16 @@ | |||
18 | #include <asm/apic.h> | 18 | #include <asm/apic.h> |
19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
20 | 20 | ||
21 | static int profile_timer_exceptions_notify(struct notifier_block *self, | 21 | static int profile_timer_exceptions_notify(unsigned int val, struct pt_regs *regs) |
22 | unsigned long val, void *data) | ||
23 | { | 22 | { |
24 | struct die_args *args = (struct die_args *)data; | 23 | oprofile_add_sample(regs, 0); |
25 | int ret = NOTIFY_DONE; | 24 | return NMI_HANDLED; |
26 | |||
27 | switch (val) { | ||
28 | case DIE_NMI: | ||
29 | oprofile_add_sample(args->regs, 0); | ||
30 | ret = NOTIFY_STOP; | ||
31 | break; | ||
32 | default: | ||
33 | break; | ||
34 | } | ||
35 | return ret; | ||
36 | } | 25 | } |
37 | 26 | ||
38 | static struct notifier_block profile_timer_exceptions_nb = { | ||
39 | .notifier_call = profile_timer_exceptions_notify, | ||
40 | .next = NULL, | ||
41 | .priority = NMI_LOW_PRIOR, | ||
42 | }; | ||
43 | |||
44 | static int timer_start(void) | 27 | static int timer_start(void) |
45 | { | 28 | { |
46 | if (register_die_notifier(&profile_timer_exceptions_nb)) | 29 | if (register_nmi_handler(NMI_LOCAL, profile_timer_exceptions_notify, |
30 | 0, "oprofile-timer")) | ||
47 | return 1; | 31 | return 1; |
48 | return 0; | 32 | return 0; |
49 | } | 33 | } |
@@ -51,7 +35,7 @@ static int timer_start(void) | |||
51 | 35 | ||
52 | static void timer_stop(void) | 36 | static void timer_stop(void) |
53 | { | 37 | { |
54 | unregister_die_notifier(&profile_timer_exceptions_nb); | 38 | unregister_nmi_handler(NMI_LOCAL, "oprofile-timer"); |
55 | synchronize_sched(); /* Allow already-started NMIs to complete. */ | 39 | synchronize_sched(); /* Allow already-started NMIs to complete. */ |
56 | } | 40 | } |
57 | 41 | ||