xref: /linux/arch/x86/include/asm/trace/irq_vectors.h (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1 #undef TRACE_SYSTEM
2 #define TRACE_SYSTEM irq_vectors
3 
4 #if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ)
5 #define _TRACE_IRQ_VECTORS_H
6 
7 #include <linux/tracepoint.h>
8 
9 extern int trace_irq_vector_regfunc(void);
10 extern void trace_irq_vector_unregfunc(void);
11 
12 DECLARE_EVENT_CLASS(x86_irq_vector,
13 
14 	TP_PROTO(int vector),
15 
16 	TP_ARGS(vector),
17 
18 	TP_STRUCT__entry(
19 		__field(		int,	vector	)
20 	),
21 
22 	TP_fast_assign(
23 		__entry->vector = vector;
24 	),
25 
26 	TP_printk("vector=%d", __entry->vector) );
27 
28 #define DEFINE_IRQ_VECTOR_EVENT(name)		\
29 DEFINE_EVENT_FN(x86_irq_vector, name##_entry,	\
30 	TP_PROTO(int vector),			\
31 	TP_ARGS(vector),			\
32 	trace_irq_vector_regfunc,		\
33 	trace_irq_vector_unregfunc);		\
34 DEFINE_EVENT_FN(x86_irq_vector, name##_exit,	\
35 	TP_PROTO(int vector),			\
36 	TP_ARGS(vector),			\
37 	trace_irq_vector_regfunc,		\
38 	trace_irq_vector_unregfunc);
39 
40 
41 /*
42  * local_timer - called when entering/exiting a local timer interrupt
43  * vector handler
44  */
45 DEFINE_IRQ_VECTOR_EVENT(local_timer);
46 
47 /*
48  * reschedule - called when entering/exiting a reschedule vector handler
49  */
50 DEFINE_IRQ_VECTOR_EVENT(reschedule);
51 
52 /*
53  * spurious_apic - called when entering/exiting a spurious apic vector handler
54  */
55 DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
56 
57 /*
58  * error_apic - called when entering/exiting an error apic vector handler
59  */
60 DEFINE_IRQ_VECTOR_EVENT(error_apic);
61 
62 /*
63  * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt
64  * vector handler
65  */
66 DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
67 
68 /*
69  * irq_work - called when entering/exiting a irq work interrupt
70  * vector handler
71  */
72 DEFINE_IRQ_VECTOR_EVENT(irq_work);
73 
74 /*
75  * We must dis-allow sampling irq_work_exit() because perf event sampling
76  * itself can cause irq_work, which would lead to an infinite loop;
77  *
78  *  1) irq_work_exit happens
79  *  2) generates perf sample
80  *  3) generates irq_work
81  *  4) goto 1
82  */
83 TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
84 
85 /*
86  * call_function - called when entering/exiting a call function interrupt
87  * vector handler
88  */
89 DEFINE_IRQ_VECTOR_EVENT(call_function);
90 
91 /*
92  * call_function_single - called when entering/exiting a call function
93  * single interrupt vector handler
94  */
95 DEFINE_IRQ_VECTOR_EVENT(call_function_single);
96 
97 /*
98  * threshold_apic - called when entering/exiting a threshold apic interrupt
99  * vector handler
100  */
101 DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
102 
103 /*
104  * deferred_error_apic - called when entering/exiting a deferred apic interrupt
105  * vector handler
106  */
107 DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic);
108 
109 /*
110  * thermal_apic - called when entering/exiting a thermal apic interrupt
111  * vector handler
112  */
113 DEFINE_IRQ_VECTOR_EVENT(thermal_apic);
114 
115 #undef TRACE_INCLUDE_PATH
116 #define TRACE_INCLUDE_PATH .
117 #define TRACE_INCLUDE_FILE irq_vectors
118 #endif /*  _TRACE_IRQ_VECTORS_H */
119 
120 /* This part must be outside protection */
121 #include <trace/define_trace.h>
122