From 0f45241afa315c5aeb65a859c924e52ad8765831 Mon Sep 17 00:00:00 2001 From: Don Zickus Date: Fri, 30 Sep 2011 15:06:23 -0400 Subject: [PATCH] --- yaml --- r: 269037 b: refs/heads/master c: efc3aac5f3d7dbd47fd0a4983979dd4342a78fba h: refs/heads/master i: 269035: a28449e8c37db42b5b898ee275c4ce00d49a9c68 v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/nmi.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index dcc4f38831b3..f13d7b6cefcb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b227e23399dc59977aa42c49bd668bdab7a61812 +refs/heads/master: efc3aac5f3d7dbd47fd0a4983979dd4342a78fba diff --git a/trunk/arch/x86/kernel/nmi.c b/trunk/arch/x86/kernel/nmi.c index 35b39592732b..d0eaa31b9f37 100644 --- a/trunk/arch/x86/kernel/nmi.c +++ b/trunk/arch/x86/kernel/nmi.c @@ -53,6 +53,15 @@ static struct nmi_desc nmi_desc[NMI_MAX] = }; +struct nmi_stats { + unsigned int normal; + unsigned int unknown; + unsigned int external; + unsigned int swallow; +}; + +static DEFINE_PER_CPU(struct nmi_stats, nmi_stats); + static int ignore_nmis; int unknown_nmi_panic; @@ -262,8 +271,13 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs) * if it caused the NMI) */ handled = nmi_handle(NMI_UNKNOWN, regs, false); - if (handled) + if (handled) { + __this_cpu_add(nmi_stats.unknown, handled); return; + } + + __this_cpu_add(nmi_stats.unknown, 1); + #ifdef CONFIG_MCA /* * Might actually be able to figure out what the guilty party @@ -314,6 +328,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) __this_cpu_write(last_nmi_rip, regs->ip); handled = nmi_handle(NMI_LOCAL, regs, b2b); + __this_cpu_add(nmi_stats.normal, handled); if (handled) { /* * There are cases when a NMI handler handles multiple @@ -344,6 +359,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) */ reassert_nmi(); #endif + __this_cpu_add(nmi_stats.external, 1); raw_spin_unlock(&nmi_reason_lock); return; } @@ -380,7 +396,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) * for now. */ if (b2b && __this_cpu_read(swallow_nmi)) - ; + __this_cpu_add(nmi_stats.swallow, 1); else unknown_nmi_error(reason, regs); }