diff options
Diffstat (limited to 'drivers/staging/lttng/instrumentation/events/mainline/irq.h')
-rw-r--r-- | drivers/staging/lttng/instrumentation/events/mainline/irq.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/drivers/staging/lttng/instrumentation/events/mainline/irq.h b/drivers/staging/lttng/instrumentation/events/mainline/irq.h new file mode 100644 index 00000000000..1c09820df58 --- /dev/null +++ b/drivers/staging/lttng/instrumentation/events/mainline/irq.h | |||
@@ -0,0 +1,150 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM irq | ||
3 | |||
4 | #if !defined(_TRACE_IRQ_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_IRQ_H | ||
6 | |||
7 | #include <linux/tracepoint.h> | ||
8 | |||
9 | struct irqaction; | ||
10 | struct softirq_action; | ||
11 | |||
12 | #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq } | ||
13 | #define show_softirq_name(val) \ | ||
14 | __print_symbolic(val, \ | ||
15 | softirq_name(HI), \ | ||
16 | softirq_name(TIMER), \ | ||
17 | softirq_name(NET_TX), \ | ||
18 | softirq_name(NET_RX), \ | ||
19 | softirq_name(BLOCK), \ | ||
20 | softirq_name(BLOCK_IOPOLL), \ | ||
21 | softirq_name(TASKLET), \ | ||
22 | softirq_name(SCHED), \ | ||
23 | softirq_name(HRTIMER), \ | ||
24 | softirq_name(RCU)) | ||
25 | |||
26 | /** | ||
27 | * irq_handler_entry - called immediately before the irq action handler | ||
28 | * @irq: irq number | ||
29 | * @action: pointer to struct irqaction | ||
30 | * | ||
31 | * The struct irqaction pointed to by @action contains various | ||
32 | * information about the handler, including the device name, | ||
33 | * @action->name, and the device id, @action->dev_id. When used in | ||
34 | * conjunction with the irq_handler_exit tracepoint, we can figure | ||
35 | * out irq handler latencies. | ||
36 | */ | ||
37 | TRACE_EVENT(irq_handler_entry, | ||
38 | |||
39 | TP_PROTO(int irq, struct irqaction *action), | ||
40 | |||
41 | TP_ARGS(irq, action), | ||
42 | |||
43 | TP_STRUCT__entry( | ||
44 | __field( int, irq ) | ||
45 | __string( name, action->name ) | ||
46 | ), | ||
47 | |||
48 | TP_fast_assign( | ||
49 | __entry->irq = irq; | ||
50 | __assign_str(name, action->name); | ||
51 | ), | ||
52 | |||
53 | TP_printk("irq=%d name=%s", __entry->irq, __get_str(name)) | ||
54 | ); | ||
55 | |||
56 | /** | ||
57 | * irq_handler_exit - called immediately after the irq action handler returns | ||
58 | * @irq: irq number | ||
59 | * @action: pointer to struct irqaction | ||
60 | * @ret: return value | ||
61 | * | ||
62 | * If the @ret value is set to IRQ_HANDLED, then we know that the corresponding | ||
63 | * @action->handler scuccessully handled this irq. Otherwise, the irq might be | ||
64 | * a shared irq line, or the irq was not handled successfully. Can be used in | ||
65 | * conjunction with the irq_handler_entry to understand irq handler latencies. | ||
66 | */ | ||
67 | TRACE_EVENT(irq_handler_exit, | ||
68 | |||
69 | TP_PROTO(int irq, struct irqaction *action, int ret), | ||
70 | |||
71 | TP_ARGS(irq, action, ret), | ||
72 | |||
73 | TP_STRUCT__entry( | ||
74 | __field( int, irq ) | ||
75 | __field( int, ret ) | ||
76 | ), | ||
77 | |||
78 | TP_fast_assign( | ||
79 | __entry->irq = irq; | ||
80 | __entry->ret = ret; | ||
81 | ), | ||
82 | |||
83 | TP_printk("irq=%d ret=%s", | ||
84 | __entry->irq, __entry->ret ? "handled" : "unhandled") | ||
85 | ); | ||
86 | |||
87 | DECLARE_EVENT_CLASS(softirq, | ||
88 | |||
89 | TP_PROTO(unsigned int vec_nr), | ||
90 | |||
91 | TP_ARGS(vec_nr), | ||
92 | |||
93 | TP_STRUCT__entry( | ||
94 | __field( unsigned int, vec ) | ||
95 | ), | ||
96 | |||
97 | TP_fast_assign( | ||
98 | __entry->vec = vec_nr; | ||
99 | ), | ||
100 | |||
101 | TP_printk("vec=%u [action=%s]", __entry->vec, | ||
102 | show_softirq_name(__entry->vec)) | ||
103 | ); | ||
104 | |||
105 | /** | ||
106 | * softirq_entry - called immediately before the softirq handler | ||
107 | * @vec_nr: softirq vector number | ||
108 | * | ||
109 | * When used in combination with the softirq_exit tracepoint | ||
110 | * we can determine the softirq handler runtine. | ||
111 | */ | ||
112 | DEFINE_EVENT(softirq, softirq_entry, | ||
113 | |||
114 | TP_PROTO(unsigned int vec_nr), | ||
115 | |||
116 | TP_ARGS(vec_nr) | ||
117 | ); | ||
118 | |||
119 | /** | ||
120 | * softirq_exit - called immediately after the softirq handler returns | ||
121 | * @vec_nr: softirq vector number | ||
122 | * | ||
123 | * When used in combination with the softirq_entry tracepoint | ||
124 | * we can determine the softirq handler runtine. | ||
125 | */ | ||
126 | DEFINE_EVENT(softirq, softirq_exit, | ||
127 | |||
128 | TP_PROTO(unsigned int vec_nr), | ||
129 | |||
130 | TP_ARGS(vec_nr) | ||
131 | ); | ||
132 | |||
133 | /** | ||
134 | * softirq_raise - called immediately when a softirq is raised | ||
135 | * @vec_nr: softirq vector number | ||
136 | * | ||
137 | * When used in combination with the softirq_entry tracepoint | ||
138 | * we can determine the softirq raise to run latency. | ||
139 | */ | ||
140 | DEFINE_EVENT(softirq, softirq_raise, | ||
141 | |||
142 | TP_PROTO(unsigned int vec_nr), | ||
143 | |||
144 | TP_ARGS(vec_nr) | ||
145 | ); | ||
146 | |||
147 | #endif /* _TRACE_IRQ_H */ | ||
148 | |||
149 | /* This part must be outside protection */ | ||
150 | #include <trace/define_trace.h> | ||