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