diff options
author | Don Zickus <dzickus@redhat.com> | 2011-01-06 16:18:50 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-01-07 09:08:53 -0500 |
commit | c410b8307702c1e1f35be3fd868ad18e4ba0410f (patch) | |
tree | f81443153309c5d144ec1d163c089cc912c3e201 | |
parent | 166d751479c6d4e5b17dfc1f204a9c4397c9b3f1 (diff) |
x86, NMI: Remove DIE_NMI_IPI
With priorities in place and no one really understanding the difference between
DIE_NMI and DIE_NMI_IPI, just remove DIE_NMI_IPI and convert everyone to DIE_NMI.
This also simplifies default_do_nmi() a little bit. Instead of calling the
die_notifier in both the if and else part, just pull it out and call it before
the if-statement. This has the side benefit of avoiding a call to the ioport
to see if there is an external NMI sitting around until after the (more frequent)
internal NMIs are dealt with.
Patch-Inspired-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <1294348732-15030-5-git-send-email-dzickus@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/include/asm/kdebug.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/apic/hw_nmi.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-inject.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/kgdb.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/reboot.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/traps.c | 19 | ||||
-rw-r--r-- | arch/x86/oprofile/nmi_int.c | 1 |
8 files changed, 12 insertions, 21 deletions
diff --git a/arch/x86/include/asm/kdebug.h b/arch/x86/include/asm/kdebug.h index f23eb2528464..ca242d35e873 100644 --- a/arch/x86/include/asm/kdebug.h +++ b/arch/x86/include/asm/kdebug.h | |||
@@ -18,7 +18,6 @@ enum die_val { | |||
18 | DIE_TRAP, | 18 | DIE_TRAP, |
19 | DIE_GPF, | 19 | DIE_GPF, |
20 | DIE_CALL, | 20 | DIE_CALL, |
21 | DIE_NMI_IPI, | ||
22 | DIE_PAGE_FAULT, | 21 | DIE_PAGE_FAULT, |
23 | DIE_NMIUNKNOWN, | 22 | DIE_NMIUNKNOWN, |
24 | }; | 23 | }; |
diff --git a/arch/x86/kernel/apic/hw_nmi.c b/arch/x86/kernel/apic/hw_nmi.c index 8bc49f1ac7bc..79fd43ca6f96 100644 --- a/arch/x86/kernel/apic/hw_nmi.c +++ b/arch/x86/kernel/apic/hw_nmi.c | |||
@@ -68,7 +68,6 @@ arch_trigger_all_cpu_backtrace_handler(struct notifier_block *self, | |||
68 | 68 | ||
69 | switch (cmd) { | 69 | switch (cmd) { |
70 | case DIE_NMI: | 70 | case DIE_NMI: |
71 | case DIE_NMI_IPI: | ||
72 | break; | 71 | break; |
73 | 72 | ||
74 | default: | 73 | default: |
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c index 59546c1219f9..a77971979564 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-inject.c +++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/gfp.h> | 25 | #include <linux/gfp.h> |
26 | #include <asm/mce.h> | 26 | #include <asm/mce.h> |
27 | #include <asm/apic.h> | 27 | #include <asm/apic.h> |
28 | #include <asm/nmi.h> | ||
28 | 29 | ||
29 | /* Update fake mce registers on current CPU. */ | 30 | /* Update fake mce registers on current CPU. */ |
30 | static void inject_mce(struct mce *m) | 31 | static void inject_mce(struct mce *m) |
@@ -83,7 +84,7 @@ static int mce_raise_notify(struct notifier_block *self, | |||
83 | struct die_args *args = (struct die_args *)data; | 84 | struct die_args *args = (struct die_args *)data; |
84 | int cpu = smp_processor_id(); | 85 | int cpu = smp_processor_id(); |
85 | struct mce *m = &__get_cpu_var(injectm); | 86 | struct mce *m = &__get_cpu_var(injectm); |
86 | if (val != DIE_NMI_IPI || !cpumask_test_cpu(cpu, mce_inject_cpumask)) | 87 | if (val != DIE_NMI || !cpumask_test_cpu(cpu, mce_inject_cpumask)) |
87 | return NOTIFY_DONE; | 88 | return NOTIFY_DONE; |
88 | cpumask_clear_cpu(cpu, mce_inject_cpumask); | 89 | cpumask_clear_cpu(cpu, mce_inject_cpumask); |
89 | if (m->inject_flags & MCJ_EXCEPTION) | 90 | if (m->inject_flags & MCJ_EXCEPTION) |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 5e14b5e5fb81..c71bae43a51b 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -1268,7 +1268,6 @@ perf_event_nmi_handler(struct notifier_block *self, | |||
1268 | 1268 | ||
1269 | switch (cmd) { | 1269 | switch (cmd) { |
1270 | case DIE_NMI: | 1270 | case DIE_NMI: |
1271 | case DIE_NMI_IPI: | ||
1272 | break; | 1271 | break; |
1273 | case DIE_NMIUNKNOWN: | 1272 | case DIE_NMIUNKNOWN: |
1274 | this_nmi = percpu_read(irq_stat.__nmi_count); | 1273 | this_nmi = percpu_read(irq_stat.__nmi_count); |
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index d43c84183d8f..a4130005028a 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
@@ -526,10 +526,6 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd) | |||
526 | } | 526 | } |
527 | return NOTIFY_DONE; | 527 | return NOTIFY_DONE; |
528 | 528 | ||
529 | case DIE_NMI_IPI: | ||
530 | /* Just ignore, we will handle the roundup on DIE_NMI. */ | ||
531 | return NOTIFY_DONE; | ||
532 | |||
533 | case DIE_NMIUNKNOWN: | 529 | case DIE_NMIUNKNOWN: |
534 | if (was_in_debug_nmi[raw_smp_processor_id()]) { | 530 | if (was_in_debug_nmi[raw_smp_processor_id()]) { |
535 | was_in_debug_nmi[raw_smp_processor_id()] = 0; | 531 | was_in_debug_nmi[raw_smp_processor_id()] = 0; |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 9c1c83e4a742..fc7aae1e2bc7 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/pci_x86.h> | 18 | #include <asm/pci_x86.h> |
19 | #include <asm/virtext.h> | 19 | #include <asm/virtext.h> |
20 | #include <asm/cpu.h> | 20 | #include <asm/cpu.h> |
21 | #include <asm/nmi.h> | ||
21 | 22 | ||
22 | #ifdef CONFIG_X86_32 | 23 | #ifdef CONFIG_X86_32 |
23 | # include <linux/ctype.h> | 24 | # include <linux/ctype.h> |
@@ -747,7 +748,7 @@ static int crash_nmi_callback(struct notifier_block *self, | |||
747 | { | 748 | { |
748 | int cpu; | 749 | int cpu; |
749 | 750 | ||
750 | if (val != DIE_NMI_IPI) | 751 | if (val != DIE_NMI) |
751 | return NOTIFY_OK; | 752 | return NOTIFY_OK; |
752 | 753 | ||
753 | cpu = raw_smp_processor_id(); | 754 | cpu = raw_smp_processor_id(); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index c7fd1cea0374..23f6ac05d04c 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -394,6 +394,14 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) | |||
394 | unsigned char reason = 0; | 394 | unsigned char reason = 0; |
395 | int cpu; | 395 | int cpu; |
396 | 396 | ||
397 | /* | ||
398 | * CPU-specific NMI must be processed before non-CPU-specific | ||
399 | * NMI, otherwise we may lose it, because the CPU-specific | ||
400 | * NMI can not be detected/processed on other CPUs. | ||
401 | */ | ||
402 | if (notify_die(DIE_NMI, "nmi", regs, 0, 2, SIGINT) == NOTIFY_STOP) | ||
403 | return; | ||
404 | |||
397 | cpu = smp_processor_id(); | 405 | cpu = smp_processor_id(); |
398 | 406 | ||
399 | /* Only the BSP gets external NMIs from the system. */ | 407 | /* Only the BSP gets external NMIs from the system. */ |
@@ -401,21 +409,10 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) | |||
401 | reason = get_nmi_reason(); | 409 | reason = get_nmi_reason(); |
402 | 410 | ||
403 | if (!(reason & NMI_REASON_MASK)) { | 411 | if (!(reason & NMI_REASON_MASK)) { |
404 | if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT) | ||
405 | == NOTIFY_STOP) | ||
406 | return; | ||
407 | |||
408 | #ifdef CONFIG_X86_LOCAL_APIC | ||
409 | if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) | ||
410 | == NOTIFY_STOP) | ||
411 | return; | ||
412 | #endif | ||
413 | unknown_nmi_error(reason, regs); | 412 | unknown_nmi_error(reason, regs); |
414 | 413 | ||
415 | return; | 414 | return; |
416 | } | 415 | } |
417 | if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP) | ||
418 | return; | ||
419 | 416 | ||
420 | /* AK: following checks seem to be broken on modern chipsets. FIXME */ | 417 | /* AK: following checks seem to be broken on modern chipsets. FIXME */ |
421 | if (reason & NMI_REASON_SERR) | 418 | if (reason & NMI_REASON_SERR) |
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index 6e84ea42085a..e77ea0b566e0 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
@@ -65,7 +65,6 @@ static int profile_exceptions_notify(struct notifier_block *self, | |||
65 | 65 | ||
66 | switch (val) { | 66 | switch (val) { |
67 | case DIE_NMI: | 67 | case DIE_NMI: |
68 | case DIE_NMI_IPI: | ||
69 | if (ctr_running) | 68 | if (ctr_running) |
70 | model->check_ctrs(args->regs, &__get_cpu_var(cpu_msrs)); | 69 | model->check_ctrs(args->regs, &__get_cpu_var(cpu_msrs)); |
71 | else if (!nmi_enabled) | 70 | else if (!nmi_enabled) |