Branch data 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 [ - + # # : 509652598 : 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 [ - + # # : 509749968 : 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 [ # # # # : 404 : 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 [ - + # # : 66553408 : 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 [ - + # # : 66724798 : 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 [ - + # # : 76421566 : 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>
|