aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorDon Zickus <dzickus@redhat.com>2011-09-30 15:06:23 -0400
committerIngo Molnar <mingo@elte.hu>2011-10-10 00:57:06 -0400
commitefc3aac5f3d7dbd47fd0a4983979dd4342a78fba (patch)
tree25887ed3c56ecc0652e4422c160ac2a1100ea9ae /arch/x86
parentb227e23399dc59977aa42c49bd668bdab7a61812 (diff)
x86, nmi: Track NMI usage stats
Now that the NMI handler are broken into lists, increment the appropriate stats for each list. This allows us to see what is going on when they get printed out in the next patch. Signed-off-by: Don Zickus <dzickus@redhat.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1317409584-23662-6-git-send-email-dzickus@redhat.com Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/nmi.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c
index 35b39592732..d0eaa31b9f3 100644
--- a/arch/x86/kernel/nmi.c
+++ b/arch/x86/kernel/nmi.c
@@ -53,6 +53,15 @@ static struct nmi_desc nmi_desc[NMI_MAX] =
53 53
54}; 54};
55 55
56struct nmi_stats {
57 unsigned int normal;
58 unsigned int unknown;
59 unsigned int external;
60 unsigned int swallow;
61};
62
63static DEFINE_PER_CPU(struct nmi_stats, nmi_stats);
64
56static int ignore_nmis; 65static int ignore_nmis;
57 66
58int unknown_nmi_panic; 67int unknown_nmi_panic;
@@ -262,8 +271,13 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
262 * if it caused the NMI) 271 * if it caused the NMI)
263 */ 272 */
264 handled = nmi_handle(NMI_UNKNOWN, regs, false); 273 handled = nmi_handle(NMI_UNKNOWN, regs, false);
265 if (handled) 274 if (handled) {
275 __this_cpu_add(nmi_stats.unknown, handled);
266 return; 276 return;
277 }
278
279 __this_cpu_add(nmi_stats.unknown, 1);
280
267#ifdef CONFIG_MCA 281#ifdef CONFIG_MCA
268 /* 282 /*
269 * Might actually be able to figure out what the guilty party 283 * 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)
314 __this_cpu_write(last_nmi_rip, regs->ip); 328 __this_cpu_write(last_nmi_rip, regs->ip);
315 329
316 handled = nmi_handle(NMI_LOCAL, regs, b2b); 330 handled = nmi_handle(NMI_LOCAL, regs, b2b);
331 __this_cpu_add(nmi_stats.normal, handled);
317 if (handled) { 332 if (handled) {
318 /* 333 /*
319 * There are cases when a NMI handler handles multiple 334 * There are cases when a NMI handler handles multiple
@@ -344,6 +359,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
344 */ 359 */
345 reassert_nmi(); 360 reassert_nmi();
346#endif 361#endif
362 __this_cpu_add(nmi_stats.external, 1);
347 raw_spin_unlock(&nmi_reason_lock); 363 raw_spin_unlock(&nmi_reason_lock);
348 return; 364 return;
349 } 365 }
@@ -380,7 +396,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
380 * for now. 396 * for now.
381 */ 397 */
382 if (b2b && __this_cpu_read(swallow_nmi)) 398 if (b2b && __this_cpu_read(swallow_nmi))
383 ; 399 __this_cpu_add(nmi_stats.swallow, 1);
384 else 400 else
385 unknown_nmi_error(reason, regs); 401 unknown_nmi_error(reason, regs);
386} 402}