};
 
+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;
         * 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
        __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
                 */
                reassert_nmi();
 #endif
+               __this_cpu_add(nmi_stats.external, 1);
                raw_spin_unlock(&nmi_reason_lock);
                return;
        }
         * for now.
         */
        if (b2b && __this_cpu_read(swallow_nmi))
-               ;
+               __this_cpu_add(nmi_stats.swallow, 1);
        else
                unknown_nmi_error(reason, regs);
 }