The latency tracer format has a nice column to indicate IRQ state, but
this is not able to tell us about NMI state.
When tracing perf interrupt handlers (which often run in NMI context)
it is very useful to see how the events nest.
Link: http://lkml.kernel.org/r/20160318153022.105068893@infradead.org
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
 #else
                TRACE_FLAG_IRQS_NOSUPPORT |
 #endif
+               ((pc & NMI_MASK    ) ? TRACE_FLAG_NMI     : 0) |
                ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
                ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
                (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) |
 
        TRACE_FLAG_HARDIRQ              = 0x08,
        TRACE_FLAG_SOFTIRQ              = 0x10,
        TRACE_FLAG_PREEMPT_RESCHED      = 0x20,
+       TRACE_FLAG_NMI                  = 0x40,
 };
 
 #define TRACE_BUF_SIZE         1024
 
        char irqs_off;
        int hardirq;
        int softirq;
+       int nmi;
 
+       nmi = entry->flags & TRACE_FLAG_NMI;
        hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
        softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
 
        }
 
        hardsoft_irq =
+               (nmi && hardirq)     ? 'Z' :
+               nmi                  ? 'z' :
                (hardirq && softirq) ? 'H' :
-               hardirq ? 'h' :
-               softirq ? 's' :
-               '.';
+               hardirq              ? 'h' :
+               softirq              ? 's' :
+                                      '.' ;
 
        trace_seq_printf(s, "%c%c%c",
                         irqs_off, need_resched, hardsoft_irq);