]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
cf910e83 SA |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM irq_vectors | |
4 | ||
5 | #if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ) | |
6 | #define _TRACE_IRQ_VECTORS_H | |
7 | ||
8 | #include <linux/tracepoint.h> | |
2feb1b31 | 9 | #include <asm/trace/common.h> |
cf910e83 | 10 | |
73285527 TG |
11 | #ifdef CONFIG_X86_LOCAL_APIC |
12 | ||
80954747 TG |
13 | extern int trace_resched_ipi_reg(void); |
14 | extern void trace_resched_ipi_unreg(void); | |
15 | ||
cf910e83 SA |
16 | DECLARE_EVENT_CLASS(x86_irq_vector, |
17 | ||
18 | TP_PROTO(int vector), | |
19 | ||
20 | TP_ARGS(vector), | |
21 | ||
22 | TP_STRUCT__entry( | |
23 | __field( int, vector ) | |
24 | ), | |
25 | ||
26 | TP_fast_assign( | |
27 | __entry->vector = vector; | |
28 | ), | |
29 | ||
30 | TP_printk("vector=%d", __entry->vector) ); | |
31 | ||
32 | #define DEFINE_IRQ_VECTOR_EVENT(name) \ | |
80954747 TG |
33 | DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \ |
34 | TP_PROTO(int vector), \ | |
35 | TP_ARGS(vector), NULL, NULL); \ | |
36 | DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ | |
37 | TP_PROTO(int vector), \ | |
38 | TP_ARGS(vector), NULL, NULL); | |
39 | ||
40 | #define DEFINE_RESCHED_IPI_EVENT(name) \ | |
cf910e83 SA |
41 | DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \ |
42 | TP_PROTO(int vector), \ | |
43 | TP_ARGS(vector), \ | |
80954747 TG |
44 | trace_resched_ipi_reg, \ |
45 | trace_resched_ipi_unreg); \ | |
cf910e83 SA |
46 | DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ |
47 | TP_PROTO(int vector), \ | |
48 | TP_ARGS(vector), \ | |
80954747 TG |
49 | trace_resched_ipi_reg, \ |
50 | trace_resched_ipi_unreg); | |
cf910e83 SA |
51 | |
52 | /* | |
53 | * local_timer - called when entering/exiting a local timer interrupt | |
54 | * vector handler | |
55 | */ | |
56 | DEFINE_IRQ_VECTOR_EVENT(local_timer); | |
57 | ||
cf910e83 SA |
58 | /* |
59 | * spurious_apic - called when entering/exiting a spurious apic vector handler | |
60 | */ | |
61 | DEFINE_IRQ_VECTOR_EVENT(spurious_apic); | |
62 | ||
63 | /* | |
64 | * error_apic - called when entering/exiting an error apic vector handler | |
65 | */ | |
66 | DEFINE_IRQ_VECTOR_EVENT(error_apic); | |
67 | ||
68 | /* | |
69 | * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt | |
70 | * vector handler | |
71 | */ | |
72 | DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi); | |
73 | ||
73285527 | 74 | #ifdef CONFIG_IRQ_WORK |
cf910e83 SA |
75 | /* |
76 | * irq_work - called when entering/exiting a irq work interrupt | |
77 | * vector handler | |
78 | */ | |
79 | DEFINE_IRQ_VECTOR_EVENT(irq_work); | |
80 | ||
d5b5f391 PZ |
81 | /* |
82 | * We must dis-allow sampling irq_work_exit() because perf event sampling | |
83 | * itself can cause irq_work, which would lead to an infinite loop; | |
84 | * | |
85 | * 1) irq_work_exit happens | |
86 | * 2) generates perf sample | |
87 | * 3) generates irq_work | |
88 | * 4) goto 1 | |
89 | */ | |
90 | TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0); | |
73285527 TG |
91 | #endif |
92 | ||
93 | /* | |
94 | * The ifdef is required because that tracepoint macro hell emits tracepoint | |
95 | * code in files which include this header even if the tracepoint is not | |
96 | * enabled. Brilliant stuff that. | |
97 | */ | |
98 | #ifdef CONFIG_SMP | |
99 | /* | |
100 | * reschedule - called when entering/exiting a reschedule vector handler | |
101 | */ | |
102 | DEFINE_RESCHED_IPI_EVENT(reschedule); | |
d5b5f391 | 103 | |
cf910e83 SA |
104 | /* |
105 | * call_function - called when entering/exiting a call function interrupt | |
106 | * vector handler | |
107 | */ | |
108 | DEFINE_IRQ_VECTOR_EVENT(call_function); | |
109 | ||
110 | /* | |
111 | * call_function_single - called when entering/exiting a call function | |
112 | * single interrupt vector handler | |
113 | */ | |
114 | DEFINE_IRQ_VECTOR_EVENT(call_function_single); | |
73285527 | 115 | #endif |
cf910e83 | 116 | |
73285527 | 117 | #ifdef CONFIG_X86_MCE_THRESHOLD |
cf910e83 SA |
118 | /* |
119 | * threshold_apic - called when entering/exiting a threshold apic interrupt | |
120 | * vector handler | |
121 | */ | |
122 | DEFINE_IRQ_VECTOR_EVENT(threshold_apic); | |
73285527 | 123 | #endif |
cf910e83 | 124 | |
73285527 | 125 | #ifdef CONFIG_X86_MCE_AMD |
24fd78a8 AG |
126 | /* |
127 | * deferred_error_apic - called when entering/exiting a deferred apic interrupt | |
128 | * vector handler | |
129 | */ | |
130 | DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic); | |
73285527 | 131 | #endif |
24fd78a8 | 132 | |
73285527 | 133 | #ifdef CONFIG_X86_THERMAL_VECTOR |
cf910e83 SA |
134 | /* |
135 | * thermal_apic - called when entering/exiting a thermal apic interrupt | |
136 | * vector handler | |
137 | */ | |
138 | DEFINE_IRQ_VECTOR_EVENT(thermal_apic); | |
73285527 TG |
139 | #endif |
140 | ||
8d1e3dca TG |
141 | TRACE_EVENT(vector_config, |
142 | ||
143 | TP_PROTO(unsigned int irq, unsigned int vector, | |
144 | unsigned int cpu, unsigned int apicdest), | |
145 | ||
146 | TP_ARGS(irq, vector, cpu, apicdest), | |
147 | ||
148 | TP_STRUCT__entry( | |
149 | __field( unsigned int, irq ) | |
150 | __field( unsigned int, vector ) | |
151 | __field( unsigned int, cpu ) | |
152 | __field( unsigned int, apicdest ) | |
153 | ), | |
154 | ||
155 | TP_fast_assign( | |
156 | __entry->irq = irq; | |
157 | __entry->vector = vector; | |
158 | __entry->cpu = cpu; | |
159 | __entry->apicdest = apicdest; | |
160 | ), | |
161 | ||
162 | TP_printk("irq=%u vector=%u cpu=%u apicdest=0x%08x", | |
163 | __entry->irq, __entry->vector, __entry->cpu, | |
164 | __entry->apicdest) | |
165 | ); | |
166 | ||
167 | DECLARE_EVENT_CLASS(vector_mod, | |
168 | ||
169 | TP_PROTO(unsigned int irq, unsigned int vector, | |
170 | unsigned int cpu, unsigned int prev_vector, | |
171 | unsigned int prev_cpu), | |
172 | ||
173 | TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), | |
174 | ||
175 | TP_STRUCT__entry( | |
176 | __field( unsigned int, irq ) | |
177 | __field( unsigned int, vector ) | |
178 | __field( unsigned int, cpu ) | |
179 | __field( unsigned int, prev_vector ) | |
180 | __field( unsigned int, prev_cpu ) | |
181 | ), | |
182 | ||
183 | TP_fast_assign( | |
184 | __entry->irq = irq; | |
185 | __entry->vector = vector; | |
186 | __entry->cpu = cpu; | |
187 | __entry->prev_vector = prev_vector; | |
188 | __entry->prev_cpu = prev_cpu; | |
189 | ||
190 | ), | |
191 | ||
192 | TP_printk("irq=%u vector=%u cpu=%u prev_vector=%u prev_cpu=%u", | |
193 | __entry->irq, __entry->vector, __entry->cpu, | |
194 | __entry->prev_vector, __entry->prev_cpu) | |
195 | ); | |
196 | ||
197 | #define DEFINE_IRQ_VECTOR_MOD_EVENT(name) \ | |
198 | DEFINE_EVENT_FN(vector_mod, name, \ | |
199 | TP_PROTO(unsigned int irq, unsigned int vector, \ | |
200 | unsigned int cpu, unsigned int prev_vector, \ | |
201 | unsigned int prev_cpu), \ | |
202 | TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), NULL, NULL); \ | |
203 | ||
204 | DEFINE_IRQ_VECTOR_MOD_EVENT(vector_update); | |
205 | DEFINE_IRQ_VECTOR_MOD_EVENT(vector_clear); | |
206 | ||
207 | DECLARE_EVENT_CLASS(vector_reserve, | |
208 | ||
209 | TP_PROTO(unsigned int irq, int ret), | |
210 | ||
211 | TP_ARGS(irq, ret), | |
212 | ||
213 | TP_STRUCT__entry( | |
214 | __field( unsigned int, irq ) | |
215 | __field( int, ret ) | |
216 | ), | |
217 | ||
218 | TP_fast_assign( | |
219 | __entry->irq = irq; | |
220 | __entry->ret = ret; | |
221 | ), | |
222 | ||
223 | TP_printk("irq=%u ret=%d", __entry->irq, __entry->ret) | |
224 | ); | |
225 | ||
226 | #define DEFINE_IRQ_VECTOR_RESERVE_EVENT(name) \ | |
227 | DEFINE_EVENT_FN(vector_reserve, name, \ | |
228 | TP_PROTO(unsigned int irq, int ret), \ | |
229 | TP_ARGS(irq, ret), NULL, NULL); \ | |
230 | ||
231 | DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve_managed); | |
232 | DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve); | |
233 | ||
234 | TRACE_EVENT(vector_alloc, | |
235 | ||
236 | TP_PROTO(unsigned int irq, unsigned int vector, bool reserved, | |
237 | int ret), | |
238 | ||
239 | TP_ARGS(irq, vector, ret, reserved), | |
240 | ||
241 | TP_STRUCT__entry( | |
242 | __field( unsigned int, irq ) | |
243 | __field( unsigned int, vector ) | |
244 | __field( bool, reserved ) | |
245 | __field( int, ret ) | |
246 | ), | |
247 | ||
248 | TP_fast_assign( | |
249 | __entry->irq = irq; | |
250 | __entry->vector = ret < 0 ? 0 : vector; | |
251 | __entry->reserved = reserved; | |
252 | __entry->ret = ret > 0 ? 0 : ret; | |
253 | ), | |
254 | ||
255 | TP_printk("irq=%u vector=%u reserved=%d ret=%d", | |
256 | __entry->irq, __entry->vector, | |
257 | __entry->reserved, __entry->ret) | |
258 | ); | |
259 | ||
260 | TRACE_EVENT(vector_alloc_managed, | |
261 | ||
262 | TP_PROTO(unsigned int irq, unsigned int vector, | |
263 | int ret), | |
264 | ||
265 | TP_ARGS(irq, vector, ret), | |
266 | ||
267 | TP_STRUCT__entry( | |
268 | __field( unsigned int, irq ) | |
269 | __field( unsigned int, vector ) | |
270 | __field( int, ret ) | |
271 | ), | |
272 | ||
273 | TP_fast_assign( | |
274 | __entry->irq = irq; | |
275 | __entry->vector = ret < 0 ? 0 : vector; | |
276 | __entry->ret = ret > 0 ? 0 : ret; | |
277 | ), | |
278 | ||
279 | TP_printk("irq=%u vector=%u ret=%d", | |
280 | __entry->irq, __entry->vector, __entry->ret) | |
281 | ); | |
282 | ||
283 | DECLARE_EVENT_CLASS(vector_activate, | |
284 | ||
285 | TP_PROTO(unsigned int irq, bool is_managed, bool can_reserve, | |
702cb0a0 | 286 | bool reserve), |
8d1e3dca | 287 | |
702cb0a0 | 288 | TP_ARGS(irq, is_managed, can_reserve, reserve), |
8d1e3dca TG |
289 | |
290 | TP_STRUCT__entry( | |
291 | __field( unsigned int, irq ) | |
292 | __field( bool, is_managed ) | |
293 | __field( bool, can_reserve ) | |
702cb0a0 | 294 | __field( bool, reserve ) |
8d1e3dca TG |
295 | ), |
296 | ||
297 | TP_fast_assign( | |
298 | __entry->irq = irq; | |
299 | __entry->is_managed = is_managed; | |
300 | __entry->can_reserve = can_reserve; | |
702cb0a0 | 301 | __entry->reserve = reserve; |
8d1e3dca TG |
302 | ), |
303 | ||
702cb0a0 | 304 | TP_printk("irq=%u is_managed=%d can_reserve=%d reserve=%d", |
8d1e3dca | 305 | __entry->irq, __entry->is_managed, __entry->can_reserve, |
702cb0a0 | 306 | __entry->reserve) |
8d1e3dca TG |
307 | ); |
308 | ||
309 | #define DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(name) \ | |
310 | DEFINE_EVENT_FN(vector_activate, name, \ | |
311 | TP_PROTO(unsigned int irq, bool is_managed, \ | |
702cb0a0 TG |
312 | bool can_reserve, bool reserve), \ |
313 | TP_ARGS(irq, is_managed, can_reserve, reserve), NULL, NULL); \ | |
8d1e3dca TG |
314 | |
315 | DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_activate); | |
316 | DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_deactivate); | |
317 | ||
318 | TRACE_EVENT(vector_teardown, | |
319 | ||
320 | TP_PROTO(unsigned int irq, bool is_managed, bool has_reserved), | |
321 | ||
322 | TP_ARGS(irq, is_managed, has_reserved), | |
323 | ||
324 | TP_STRUCT__entry( | |
325 | __field( unsigned int, irq ) | |
326 | __field( bool, is_managed ) | |
327 | __field( bool, has_reserved ) | |
328 | ), | |
329 | ||
330 | TP_fast_assign( | |
331 | __entry->irq = irq; | |
332 | __entry->is_managed = is_managed; | |
333 | __entry->has_reserved = has_reserved; | |
334 | ), | |
335 | ||
336 | TP_printk("irq=%u is_managed=%d has_reserved=%d", | |
337 | __entry->irq, __entry->is_managed, __entry->has_reserved) | |
338 | ); | |
339 | ||
340 | TRACE_EVENT(vector_setup, | |
341 | ||
342 | TP_PROTO(unsigned int irq, bool is_legacy, int ret), | |
343 | ||
344 | TP_ARGS(irq, is_legacy, ret), | |
345 | ||
346 | TP_STRUCT__entry( | |
347 | __field( unsigned int, irq ) | |
348 | __field( bool, is_legacy ) | |
349 | __field( int, ret ) | |
350 | ), | |
351 | ||
352 | TP_fast_assign( | |
353 | __entry->irq = irq; | |
354 | __entry->is_legacy = is_legacy; | |
355 | __entry->ret = ret; | |
356 | ), | |
357 | ||
358 | TP_printk("irq=%u is_legacy=%d ret=%d", | |
359 | __entry->irq, __entry->is_legacy, __entry->ret) | |
360 | ); | |
361 | ||
362 | TRACE_EVENT(vector_free_moved, | |
363 | ||
0696d059 TG |
364 | TP_PROTO(unsigned int irq, unsigned int cpu, unsigned int vector, |
365 | bool is_managed), | |
8d1e3dca | 366 | |
0696d059 | 367 | TP_ARGS(irq, cpu, vector, is_managed), |
8d1e3dca TG |
368 | |
369 | TP_STRUCT__entry( | |
370 | __field( unsigned int, irq ) | |
0696d059 | 371 | __field( unsigned int, cpu ) |
8d1e3dca TG |
372 | __field( unsigned int, vector ) |
373 | __field( bool, is_managed ) | |
374 | ), | |
375 | ||
376 | TP_fast_assign( | |
377 | __entry->irq = irq; | |
0696d059 | 378 | __entry->cpu = cpu; |
8d1e3dca TG |
379 | __entry->vector = vector; |
380 | __entry->is_managed = is_managed; | |
381 | ), | |
382 | ||
0696d059 TG |
383 | TP_printk("irq=%u cpu=%u vector=%u is_managed=%d", |
384 | __entry->irq, __entry->cpu, __entry->vector, | |
385 | __entry->is_managed) | |
8d1e3dca TG |
386 | ); |
387 | ||
388 | ||
73285527 | 389 | #endif /* CONFIG_X86_LOCAL_APIC */ |
cf910e83 SA |
390 | |
391 | #undef TRACE_INCLUDE_PATH | |
392 | #define TRACE_INCLUDE_PATH . | |
393 | #define TRACE_INCLUDE_FILE irq_vectors | |
394 | #endif /* _TRACE_IRQ_VECTORS_H */ | |
395 | ||
396 | /* This part must be outside protection */ | |
397 | #include <trace/define_trace.h> |