xref: /linux/include/trace/events/osnoise.h (revision 88221ac0d560700b50493aedc768f728aa585141)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM osnoise
4 
5 #if !defined(_OSNOISE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
6 
7 #ifndef _OSNOISE_TRACE_H
8 #define _OSNOISE_TRACE_H
9 /*
10  * osnoise sample structure definition. Used to store the statistics of a
11  * sample run.
12  */
13 struct osnoise_sample {
14 	u64			runtime;	/* runtime */
15 	u64			noise;		/* noise */
16 	u64			max_sample;	/* max single noise sample */
17 	int			hw_count;	/* # HW (incl. hypervisor) interference */
18 	int			nmi_count;	/* # NMIs during this sample */
19 	int			irq_count;	/* # IRQs during this sample */
20 	int			softirq_count;	/* # softirqs during this sample */
21 	int			thread_count;	/* # threads during this sample */
22 };
23 
24 #ifdef CONFIG_TIMERLAT_TRACER
25 /*
26  * timerlat sample structure definition. Used to store the statistics of
27  * a sample run.
28  */
29 struct timerlat_sample {
30 	u64			timer_latency;	/* timer_latency */
31 	unsigned int		seqnum;		/* unique sequence */
32 	int			context;	/* timer context */
33 };
34 #endif // CONFIG_TIMERLAT_TRACER
35 #endif // _OSNOISE_TRACE_H
36 
37 #include <linux/tracepoint.h>
38 TRACE_EVENT(osnoise_sample,
39 
40 	TP_PROTO(struct osnoise_sample *s),
41 
42 	TP_ARGS(s),
43 
44 	TP_STRUCT__entry(
45 		__field(	u64,		runtime	)
46 		__field(	u64,		noise	)
47 		__field(	u64,		max_sample	)
48 		__field(	int,		hw_count	)
49 		__field(	int,		irq_count	)
50 		__field(	int,		nmi_count	)
51 		__field(	int, 		softirq_count	)
52 		__field(	int,		thread_count	)
53 	),
54 
55 	TP_fast_assign(
56 		__entry->runtime = s->runtime;
57 		__entry->noise = s->noise;
58 		__entry->max_sample = s->max_sample;
59 		__entry->hw_count = s->hw_count;
60 		__entry->irq_count = s->irq_count;
61 		__entry->nmi_count = s->nmi_count;
62 		__entry->softirq_count = s->softirq_count;
63 		__entry->thread_count = s->thread_count;
64 	),
65 
66 	TP_printk("runtime=%llu noise=%llu max_sample=%llu hw_count=%d"
67 		  " irq_count=%d nmi_count=%d softirq_count=%d"
68 		  " thread_count=%d",
69 		  __entry->runtime,
70 		  __entry->noise,
71 		  __entry->max_sample,
72 		  __entry->hw_count,
73 		  __entry->irq_count,
74 		  __entry->nmi_count,
75 		  __entry->softirq_count,
76 		  __entry->thread_count)
77 );
78 
79 #ifdef CONFIG_TIMERLAT_TRACER
80 TRACE_EVENT(timerlat_sample,
81 
82 	TP_PROTO(struct timerlat_sample *s),
83 
84 	TP_ARGS(s),
85 
86 	TP_STRUCT__entry(
87 		__field(	u64,		timer_latency	)
88 		__field(	unsigned int,	seqnum		)
89 		__field(	int,		context		)
90 	),
91 
92 	TP_fast_assign(
93 		__entry->timer_latency = s->timer_latency;
94 		__entry->seqnum = s->seqnum;
95 		__entry->context = s->context;
96 	),
97 
98 	TP_printk("timer_latency=%llu seqnum=%u context=%d",
99 		  __entry->timer_latency,
100 		  __entry->seqnum,
101 		  __entry->context)
102 );
103 #endif // CONFIG_TIMERLAT_TRACER
104 
105 TRACE_EVENT(thread_noise,
106 
107 	TP_PROTO(struct task_struct *t, u64 start, u64 duration),
108 
109 	TP_ARGS(t, start, duration),
110 
111 	TP_STRUCT__entry(
112 		__array(	char,		comm,	TASK_COMM_LEN)
113 		__field(	u64,		start	)
114 		__field(	u64,		duration)
115 		__field(	pid_t,		pid	)
116 	),
117 
118 	TP_fast_assign(
119 		memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
120 		__entry->pid = t->pid;
121 		__entry->start = start;
122 		__entry->duration = duration;
123 	),
124 
125 	TP_printk("%8s:%d start %llu.%09u duration %llu ns",
126 		__entry->comm,
127 		__entry->pid,
128 		__print_ns_to_secs(__entry->start),
129 		__print_ns_without_secs(__entry->start),
130 		__entry->duration)
131 );
132 
133 TRACE_EVENT(softirq_noise,
134 
135 	TP_PROTO(int vector, u64 start, u64 duration),
136 
137 	TP_ARGS(vector, start, duration),
138 
139 	TP_STRUCT__entry(
140 		__field(	u64,		start	)
141 		__field(	u64,		duration)
142 		__field(	int,		vector	)
143 	),
144 
145 	TP_fast_assign(
146 		__entry->vector = vector;
147 		__entry->start = start;
148 		__entry->duration = duration;
149 	),
150 
151 	TP_printk("%8s:%d start %llu.%09u duration %llu ns",
152 		show_softirq_name(__entry->vector),
153 		__entry->vector,
154 		__print_ns_to_secs(__entry->start),
155 		__print_ns_without_secs(__entry->start),
156 		__entry->duration)
157 );
158 
159 TRACE_EVENT(irq_noise,
160 
161 	TP_PROTO(int vector, const char *desc, u64 start, u64 duration),
162 
163 	TP_ARGS(vector, desc, start, duration),
164 
165 	TP_STRUCT__entry(
166 		__field(	u64,		start	)
167 		__field(	u64,		duration)
168 		__string(	desc,		desc    )
169 		__field(	int,		vector	)
170 
171 	),
172 
173 	TP_fast_assign(
174 		__assign_str(desc);
175 		__entry->vector = vector;
176 		__entry->start = start;
177 		__entry->duration = duration;
178 	),
179 
180 	TP_printk("%s:%d start %llu.%09u duration %llu ns",
181 		__get_str(desc),
182 		__entry->vector,
183 		__print_ns_to_secs(__entry->start),
184 		__print_ns_without_secs(__entry->start),
185 		__entry->duration)
186 );
187 
188 TRACE_EVENT(nmi_noise,
189 
190 	TP_PROTO(u64 start, u64 duration),
191 
192 	TP_ARGS(start, duration),
193 
194 	TP_STRUCT__entry(
195 		__field(	u64,		start	)
196 		__field(	u64,		duration)
197 	),
198 
199 	TP_fast_assign(
200 		__entry->start = start;
201 		__entry->duration = duration;
202 	),
203 
204 	TP_printk("start %llu.%09u duration %llu ns",
205 		__print_ns_to_secs(__entry->start),
206 		__print_ns_without_secs(__entry->start),
207 		__entry->duration)
208 );
209 
210 TRACE_EVENT(sample_threshold,
211 
212 	TP_PROTO(u64 start, u64 duration, u64 interference),
213 
214 	TP_ARGS(start, duration, interference),
215 
216 	TP_STRUCT__entry(
217 		__field(	u64,		start	)
218 		__field(	u64,		duration)
219 		__field(	u64,		interference)
220 	),
221 
222 	TP_fast_assign(
223 		__entry->start = start;
224 		__entry->duration = duration;
225 		__entry->interference = interference;
226 	),
227 
228 	TP_printk("start %llu.%09u duration %llu ns interference %llu",
229 		__print_ns_to_secs(__entry->start),
230 		__print_ns_without_secs(__entry->start),
231 		__entry->duration,
232 		__entry->interference)
233 );
234 
235 #endif /* _TRACE_OSNOISE_H */
236 
237 /* This part must be outside protection */
238 #include <trace/define_trace.h>
239