Branch data Line data Source code
1 : : #undef TRACE_SYSTEM
2 : : #define TRACE_SYSTEM timer
3 : :
4 : : #if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ)
5 : : #define _TRACE_TIMER_H
6 : :
7 : : #include <linux/tracepoint.h>
8 : : #include <linux/hrtimer.h>
9 : : #include <linux/timer.h>
10 : :
11 [ # # # # ]: 0 : DECLARE_EVENT_CLASS(timer_class,
[ # # # # ]
[ # # ][ # # ]
12 : :
13 : : TP_PROTO(struct timer_list *timer),
14 : :
15 : : TP_ARGS(timer),
16 : :
17 : : TP_STRUCT__entry(
18 : : __field( void *, timer )
19 : : ),
20 : :
21 : : TP_fast_assign(
22 : : __entry->timer = timer;
23 : : ),
24 : :
25 : : TP_printk("timer=%p", __entry->timer)
26 : : );
27 : :
28 : : /**
29 : : * timer_init - called when the timer is initialized
30 : : * @timer: pointer to struct timer_list
31 : : */
32 [ - + # # ]: 1379136 : DEFINE_EVENT(timer_class, timer_init,
[ # # ]
33 : :
34 : : TP_PROTO(struct timer_list *timer),
35 : :
36 : : TP_ARGS(timer)
37 : : );
38 : :
39 : : /**
40 : : * timer_start - called when the timer is started
41 : : * @timer: pointer to struct timer_list
42 : : * @expires: the timers expiry time
43 : : */
44 [ - + # # ]: 1283123 : TRACE_EVENT(timer_start,
[ # # ]
[ - + # # ]
[ # # ]
[ # # # # ]
[ # # ]
[ - + # # ]
[ # # ]
[ # # # # ]
[ # # ]
[ # # # # ]
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
45 : :
46 : : TP_PROTO(struct timer_list *timer, unsigned long expires),
47 : :
48 : : TP_ARGS(timer, expires),
49 : :
50 : : TP_STRUCT__entry(
51 : : __field( void *, timer )
52 : : __field( void *, function )
53 : : __field( unsigned long, expires )
54 : : __field( unsigned long, now )
55 : : ),
56 : :
57 : : TP_fast_assign(
58 : : __entry->timer = timer;
59 : : __entry->function = timer->function;
60 : : __entry->expires = expires;
61 : : __entry->now = jiffies;
62 : : ),
63 : :
64 : : TP_printk("timer=%p function=%pf expires=%lu [timeout=%ld]",
65 : : __entry->timer, __entry->function, __entry->expires,
66 : : (long)__entry->expires - __entry->now)
67 : : );
68 : :
69 : : /**
70 : : * timer_expire_entry - called immediately before the timer callback
71 : : * @timer: pointer to struct timer_list
72 : : *
73 : : * Allows to determine the timer latency.
74 : : */
75 [ - + # # ]: 1105392 : TRACE_EVENT(timer_expire_entry,
[ # # ]
[ # # # # ]
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
76 : :
77 : : TP_PROTO(struct timer_list *timer),
78 : :
79 : : TP_ARGS(timer),
80 : :
81 : : TP_STRUCT__entry(
82 : : __field( void *, timer )
83 : : __field( unsigned long, now )
84 : : __field( void *, function)
85 : : ),
86 : :
87 : : TP_fast_assign(
88 : : __entry->timer = timer;
89 : : __entry->now = jiffies;
90 : : __entry->function = timer->function;
91 : : ),
92 : :
93 : : TP_printk("timer=%p function=%pf now=%lu", __entry->timer, __entry->function,__entry->now)
94 : : );
95 : :
96 : : /**
97 : : * timer_expire_exit - called immediately after the timer callback returns
98 : : * @timer: pointer to struct timer_list
99 : : *
100 : : * When used in combination with the timer_expire_entry tracepoint we can
101 : : * determine the runtime of the timer callback function.
102 : : *
103 : : * NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might
104 : : * be invalid. We solely track the pointer.
105 : : */
106 [ - + # # ]: 1106038 : DEFINE_EVENT(timer_class, timer_expire_exit,
[ # # ]
107 : :
108 : : TP_PROTO(struct timer_list *timer),
109 : :
110 : : TP_ARGS(timer)
111 : : );
112 : :
113 : : /**
114 : : * timer_cancel - called when the timer is canceled
115 : : * @timer: pointer to struct timer_list
116 : : */
117 [ - + # # ]: 1282734 : DEFINE_EVENT(timer_class, timer_cancel,
[ # # ]
[ - + # # ]
[ # # ]
[ - + # # ]
[ # # ]
118 : :
119 : : TP_PROTO(struct timer_list *timer),
120 : :
121 : : TP_ARGS(timer)
122 : : );
123 : :
124 : : /**
125 : : * hrtimer_init - called when the hrtimer is initialized
126 : : * @hrtimer: pointer to struct hrtimer
127 : : * @clockid: the hrtimers clock
128 : : * @mode: the hrtimers mode
129 : : */
130 [ # # # # ]: 2967238 : TRACE_EVENT(hrtimer_init,
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ - + # # ]
[ # # ]
131 : :
132 : : TP_PROTO(struct hrtimer *hrtimer, clockid_t clockid,
133 : : enum hrtimer_mode mode),
134 : :
135 : : TP_ARGS(hrtimer, clockid, mode),
136 : :
137 : : TP_STRUCT__entry(
138 : : __field( void *, hrtimer )
139 : : __field( clockid_t, clockid )
140 : : __field( enum hrtimer_mode, mode )
141 : : ),
142 : :
143 : : TP_fast_assign(
144 : : __entry->hrtimer = hrtimer;
145 : : __entry->clockid = clockid;
146 : : __entry->mode = mode;
147 : : ),
148 : :
149 : : TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer,
150 : : __entry->clockid == CLOCK_REALTIME ?
151 : : "CLOCK_REALTIME" : "CLOCK_MONOTONIC",
152 : : __entry->mode == HRTIMER_MODE_ABS ?
153 : : "HRTIMER_MODE_ABS" : "HRTIMER_MODE_REL")
154 : : );
155 : :
156 : : /**
157 : : * hrtimer_start - called when the hrtimer is started
158 : : * @hrtimer: pointer to struct hrtimer
159 : : */
160 [ # # # # ]: 8560429 : TRACE_EVENT(hrtimer_start,
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
[ - + # # ]
[ # # ]
161 : :
162 : : TP_PROTO(struct hrtimer *hrtimer),
163 : :
164 : : TP_ARGS(hrtimer),
165 : :
166 : : TP_STRUCT__entry(
167 : : __field( void *, hrtimer )
168 : : __field( void *, function )
169 : : __field( s64, expires )
170 : : __field( s64, softexpires )
171 : : ),
172 : :
173 : : TP_fast_assign(
174 : : __entry->hrtimer = hrtimer;
175 : : __entry->function = hrtimer->function;
176 : : __entry->expires = hrtimer_get_expires(hrtimer).tv64;
177 : : __entry->softexpires = hrtimer_get_softexpires(hrtimer).tv64;
178 : : ),
179 : :
180 : : TP_printk("hrtimer=%p function=%pf expires=%llu softexpires=%llu",
181 : : __entry->hrtimer, __entry->function,
182 : : (unsigned long long)ktime_to_ns((ktime_t) {
183 : : .tv64 = __entry->expires }),
184 : : (unsigned long long)ktime_to_ns((ktime_t) {
185 : : .tv64 = __entry->softexpires }))
186 : : );
187 : :
188 : : /**
189 : : * hrtimer_expire_entry - called immediately before the hrtimer callback
190 : : * @hrtimer: pointer to struct hrtimer
191 : : * @now: pointer to variable which contains current time of the
192 : : * timers base.
193 : : *
194 : : * Allows to determine the timer latency.
195 : : */
196 [ # # # # ]: 2962801 : TRACE_EVENT(hrtimer_expire_entry,
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ - + # # ]
[ # # ]
197 : :
198 : : TP_PROTO(struct hrtimer *hrtimer, ktime_t *now),
199 : :
200 : : TP_ARGS(hrtimer, now),
201 : :
202 : : TP_STRUCT__entry(
203 : : __field( void *, hrtimer )
204 : : __field( s64, now )
205 : : __field( void *, function)
206 : : ),
207 : :
208 : : TP_fast_assign(
209 : : __entry->hrtimer = hrtimer;
210 : : __entry->now = now->tv64;
211 : : __entry->function = hrtimer->function;
212 : : ),
213 : :
214 : : TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
215 : : (unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
216 : : );
217 : :
218 [ # # # # ]: 0 : DECLARE_EVENT_CLASS(hrtimer_class,
[ # # # # ]
[ # # ][ # # ]
219 : :
220 : : TP_PROTO(struct hrtimer *hrtimer),
221 : :
222 : : TP_ARGS(hrtimer),
223 : :
224 : : TP_STRUCT__entry(
225 : : __field( void *, hrtimer )
226 : : ),
227 : :
228 : : TP_fast_assign(
229 : : __entry->hrtimer = hrtimer;
230 : : ),
231 : :
232 : : TP_printk("hrtimer=%p", __entry->hrtimer)
233 : : );
234 : :
235 : : /**
236 : : * hrtimer_expire_exit - called immediately after the hrtimer callback returns
237 : : * @hrtimer: pointer to struct hrtimer
238 : : *
239 : : * When used in combination with the hrtimer_expire_entry tracepoint we can
240 : : * determine the runtime of the callback function.
241 : : */
242 [ - + # # ]: 2968643 : DEFINE_EVENT(hrtimer_class, hrtimer_expire_exit,
[ # # ]
243 : :
244 : : TP_PROTO(struct hrtimer *hrtimer),
245 : :
246 : : TP_ARGS(hrtimer)
247 : : );
248 : :
249 : : /**
250 : : * hrtimer_cancel - called when the hrtimer is canceled
251 : : * @hrtimer: pointer to struct hrtimer
252 : : */
253 [ # # # # ]: 8564176 : DEFINE_EVENT(hrtimer_class, hrtimer_cancel,
[ # # ]
[ - + # # ]
[ # # ]
[ - + # # ]
[ # # ]
[ - + # # ]
[ # # ]
254 : :
255 : : TP_PROTO(struct hrtimer *hrtimer),
256 : :
257 : : TP_ARGS(hrtimer)
258 : : );
259 : :
260 : : /**
261 : : * itimer_state - called when itimer is started or canceled
262 : : * @which: name of the interval timer
263 : : * @value: the itimers value, itimer is canceled if value->it_value is
264 : : * zero, otherwise it is started
265 : : * @expires: the itimers expiry time
266 : : */
267 [ # # # # ]: 14305 : TRACE_EVENT(itimer_state,
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
[ - + # # ]
[ # # ]
[ - + # # ]
[ # # ]
268 : :
269 : : TP_PROTO(int which, const struct itimerval *const value,
270 : : cputime_t expires),
271 : :
272 : : TP_ARGS(which, value, expires),
273 : :
274 : : TP_STRUCT__entry(
275 : : __field( int, which )
276 : : __field( cputime_t, expires )
277 : : __field( long, value_sec )
278 : : __field( long, value_usec )
279 : : __field( long, interval_sec )
280 : : __field( long, interval_usec )
281 : : ),
282 : :
283 : : TP_fast_assign(
284 : : __entry->which = which;
285 : : __entry->expires = expires;
286 : : __entry->value_sec = value->it_value.tv_sec;
287 : : __entry->value_usec = value->it_value.tv_usec;
288 : : __entry->interval_sec = value->it_interval.tv_sec;
289 : : __entry->interval_usec = value->it_interval.tv_usec;
290 : : ),
291 : :
292 : : TP_printk("which=%d expires=%llu it_value=%ld.%ld it_interval=%ld.%ld",
293 : : __entry->which, (unsigned long long)__entry->expires,
294 : : __entry->value_sec, __entry->value_usec,
295 : : __entry->interval_sec, __entry->interval_usec)
296 : : );
297 : :
298 : : /**
299 : : * itimer_expire - called when itimer expires
300 : : * @which: type of the interval timer
301 : : * @pid: pid of the process which owns the timer
302 : : * @now: current time, used to calculate the latency of itimer
303 : : */
304 [ - # # ]: 10742 : TRACE_EVENT(itimer_expire,
[ # # ]
[ # # # # ]
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ - + # # ]
305 : :
306 : : TP_PROTO(int which, struct pid *pid, cputime_t now),
307 : :
308 : : TP_ARGS(which, pid, now),
309 : :
310 : : TP_STRUCT__entry(
311 : : __field( int , which )
312 : : __field( pid_t, pid )
313 : : __field( cputime_t, now )
314 : : ),
315 : :
316 : : TP_fast_assign(
317 : : __entry->which = which;
318 : : __entry->now = now;
319 : : __entry->pid = pid_nr(pid);
320 : : ),
321 : :
322 : : TP_printk("which=%d pid=%d now=%llu", __entry->which,
323 : : (int) __entry->pid, (unsigned long long)__entry->now)
324 : : );
325 : :
326 : : #ifdef CONFIG_NO_HZ_COMMON
327 [ - + # # ]: 3092248 : TRACE_EVENT(tick_stop,
[ # # ][ # # ]
[ # # ]
[ # # # # ]
[ # # ]
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
328 : :
329 : : TP_PROTO(int success, char *error_msg),
330 : :
331 : : TP_ARGS(success, error_msg),
332 : :
333 : : TP_STRUCT__entry(
334 : : __field( int , success )
335 : : __string( msg, error_msg )
336 : : ),
337 : :
338 : : TP_fast_assign(
339 : : __entry->success = success;
340 : : __assign_str(msg, error_msg);
341 : : ),
342 : :
343 : : TP_printk("success=%s msg=%s", __entry->success ? "yes" : "no", __get_str(msg))
344 : : );
345 : : #endif
346 : :
347 : : #endif /* _TRACE_TIMER_H */
348 : :
349 : : /* This part must be outside protection */
350 : : #include <trace/define_trace.h>
|