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

Commit af39241b authored by Jason Baron's avatar Jason Baron Committed by Ingo Molnar
Browse files

tracing, genirq: add irq enter and exit trace events



Impact: add new tracepoints

Add them to the generic IRQ code, that way every architecture
gets these new tracepoints, not just x86.

Using Steve's new 'TRACE_FORMAT', I can get function graph
trace as follows using the original two IRQ tracepoints:

 3)               |    handle_IRQ_event() {
 3)               |    /* (irq_handler_entry) irq=28 handler=eth0 */
 3)               |    e1000_intr_msi() {
 3)   2.460 us    |      __napi_schedule();
 3)   9.416 us    |    }
 3)               |    /* (irq_handler_exit) irq=28 handler=eth0 return=handled */
 3) + 22.935 us   |  }

Signed-off-by: default avatarJason Baron <jbaron@redhat.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
Acked-by: default avatarMasami Hiramatsu <mhiramat@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mathieu Desnoyers <compudj@krystal.dyndns.org>
Cc: "Frank Ch. Eigler" <fche@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 8656e7a2
Loading
Loading
Loading
Loading

include/trace/irq.h

0 → 100644
+9 −0
Original line number Original line Diff line number Diff line
#ifndef _TRACE_IRQ_H
#define _TRACE_IRQ_H

#include <linux/interrupt.h>
#include <linux/tracepoint.h>

#include <trace/irq_event_types.h>

#endif
+17 −0
Original line number Original line Diff line number Diff line

/* use <trace/irq.h> instead */
#ifndef TRACE_FORMAT
# error Do not include this file directly.
# error Unless you know what you are doing.
#endif

TRACE_FORMAT(irq_handler_entry,
	TPPROTO(int irq, struct irqaction *action),
	TPARGS(irq, action),
	TPFMT("irq=%d handler=%s", irq, action->name));

TRACE_FORMAT(irq_handler_exit,
	TPPROTO(int irq, struct irqaction *action, int ret),
	TPARGS(irq, action, ret),
	TPFMT("irq=%d handler=%s return=%s",
		irq, action->name, ret ? "handled" : "unhandled"));
+6 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/kernel_stat.h>
#include <linux/kernel_stat.h>
#include <linux/rculist.h>
#include <linux/rculist.h>
#include <linux/hash.h>
#include <linux/hash.h>
#include <trace/irq.h>


#include "internals.h"
#include "internals.h"


@@ -316,6 +317,9 @@ irqreturn_t no_action(int cpl, void *dev_id)
	return IRQ_NONE;
	return IRQ_NONE;
}
}


DEFINE_TRACE(irq_handler_entry);
DEFINE_TRACE(irq_handler_exit);

/**
/**
 * handle_IRQ_event - irq action chain handler
 * handle_IRQ_event - irq action chain handler
 * @irq:	the interrupt number
 * @irq:	the interrupt number
@@ -332,7 +336,9 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
		local_irq_enable_in_hardirq();
		local_irq_enable_in_hardirq();


	do {
	do {
		trace_irq_handler_entry(irq, action);
		ret = action->handler(irq, action->dev_id);
		ret = action->handler(irq, action->dev_id);
		trace_irq_handler_exit(irq, action, ret);
		if (ret == IRQ_HANDLED)
		if (ret == IRQ_HANDLED)
			status |= action->flags;
			status |= action->flags;
		retval |= ret;
		retval |= ret;
+2 −0
Original line number Original line Diff line number Diff line
@@ -6,8 +6,10 @@


/* trace/<type>.h here */
/* trace/<type>.h here */
#include <trace/sched.h>
#include <trace/sched.h>
#include <trace/irq.h>


#include "trace_events.h"
#include "trace_events.h"


/* trace/<type>_event_types.h here */
/* trace/<type>_event_types.h here */
#include <trace/sched_event_types.h>
#include <trace/sched_event_types.h>
#include <trace/irq_event_types.h>