Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e6867bf authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Steven Rostedt
Browse files

tracing: Record and show NMI state

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: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 3debb0a9
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -1664,6 +1664,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,
#else
#else
		TRACE_FLAG_IRQS_NOSUPPORT |
		TRACE_FLAG_IRQS_NOSUPPORT |
#endif
#endif
		((pc & NMI_MASK    ) ? TRACE_FLAG_NMI     : 0) |
		((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
		((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
		((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
		((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
		(tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) |
		(tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) |
+1 −0
Original line number Original line Diff line number Diff line
@@ -125,6 +125,7 @@ enum trace_flag_type {
	TRACE_FLAG_HARDIRQ		= 0x08,
	TRACE_FLAG_HARDIRQ		= 0x08,
	TRACE_FLAG_SOFTIRQ		= 0x10,
	TRACE_FLAG_SOFTIRQ		= 0x10,
	TRACE_FLAG_PREEMPT_RESCHED	= 0x20,
	TRACE_FLAG_PREEMPT_RESCHED	= 0x20,
	TRACE_FLAG_NMI			= 0x40,
};
};


#define TRACE_BUF_SIZE		1024
#define TRACE_BUF_SIZE		1024
+7 −3
Original line number Original line Diff line number Diff line
@@ -389,7 +389,9 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
	char irqs_off;
	char irqs_off;
	int hardirq;
	int hardirq;
	int softirq;
	int softirq;
	int nmi;


	nmi = entry->flags & TRACE_FLAG_NMI;
	hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
	hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
	softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
	softirq = entry->flags & TRACE_FLAG_SOFTIRQ;


@@ -415,6 +417,8 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
	}
	}


	hardsoft_irq =
	hardsoft_irq =
		(nmi && hardirq)     ? 'Z' :
		nmi                  ? 'z' :
		(hardirq && softirq) ? 'H' :
		(hardirq && softirq) ? 'H' :
		hardirq              ? 'h' :
		hardirq              ? 'h' :
		softirq              ? 's' :
		softirq              ? 's' :