Extend sched_process_fork with scheduling fields
[deliverable/lttng-modules.git] / instrumentation / events / lttng-module / sched.h
1 #undef TRACE_SYSTEM
2 #define TRACE_SYSTEM sched
3
4 #if !defined(LTTNG_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
5 #define LTTNG_TRACE_SCHED_H
6
7 #include <probes/lttng-tracepoint-event.h>
8 #include <linux/sched.h>
9 #include <linux/pid_namespace.h>
10 #include <linux/binfmts.h>
11 #include <linux/version.h>
12 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
13 #include <linux/sched/rt.h>
14 #endif
15
16 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0))
17 #define lttng_proc_inum ns.inum
18 #else
19 #define lttng_proc_inum proc_inum
20 #endif
21
22 #define LTTNG_MAX_PID_NS_LEVEL 32
23
24 #ifndef _TRACE_SCHED_DEF_
25 #define _TRACE_SCHED_DEF_
26
27 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
28
29 static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p)
30 {
31 #ifdef CONFIG_SCHED_DEBUG
32 BUG_ON(p != current);
33 #endif /* CONFIG_SCHED_DEBUG */
34 /*
35 * Preemption ignores task state, therefore preempted tasks are always RUNNING
36 * (we will not have dequeued if state != RUNNING).
37 */
38 return preempt ? TASK_RUNNING | TASK_STATE_MAX : p->state;
39 }
40
41 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0))
42
43 static inline long __trace_sched_switch_state(struct task_struct *p)
44 {
45 long state = p->state;
46
47 #ifdef CONFIG_PREEMPT
48 #ifdef CONFIG_SCHED_DEBUG
49 BUG_ON(p != current);
50 #endif /* CONFIG_SCHED_DEBUG */
51 /*
52 * For all intents and purposes a preempted task is a running task.
53 */
54 if (preempt_count() & PREEMPT_ACTIVE)
55 state = TASK_RUNNING | TASK_STATE_MAX;
56 #endif /* CONFIG_PREEMPT */
57
58 return state;
59 }
60
61 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,0))
62
63 static inline long __trace_sched_switch_state(struct task_struct *p)
64 {
65 long state = p->state;
66
67 #ifdef CONFIG_PREEMPT
68 /*
69 * For all intents and purposes a preempted task is a running task.
70 */
71 if (task_preempt_count(p) & PREEMPT_ACTIVE)
72 state = TASK_RUNNING | TASK_STATE_MAX;
73 #endif
74
75 return state;
76 }
77
78 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
79
80 static inline long __trace_sched_switch_state(struct task_struct *p)
81 {
82 long state = p->state;
83
84 #ifdef CONFIG_PREEMPT
85 /*
86 * For all intents and purposes a preempted task is a running task.
87 */
88 if (task_thread_info(p)->preempt_count & PREEMPT_ACTIVE)
89 state = TASK_RUNNING | TASK_STATE_MAX;
90 #endif
91
92 return state;
93 }
94
95 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
96
97 static inline long __trace_sched_switch_state(struct task_struct *p)
98 {
99 long state = p->state;
100
101 #ifdef CONFIG_PREEMPT
102 /*
103 * For all intents and purposes a preempted task is a running task.
104 */
105 if (task_thread_info(p)->preempt_count & PREEMPT_ACTIVE)
106 state = TASK_RUNNING;
107 #endif
108
109 return state;
110 }
111
112 #endif
113
114 #endif /* _TRACE_SCHED_DEF_ */
115
116 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0))
117 LTTNG_TRACEPOINT_ENUM(lttng_sched_policy,
118 TP_ENUM_VALUES(
119 ctf_enum_value("SCHED_NORMAL", SCHED_NORMAL)
120 ctf_enum_value("SCHED_FIFO", SCHED_FIFO)
121 ctf_enum_value("SCHED_RR", SCHED_RR)
122 ctf_enum_value("SCHED_BATCH", SCHED_BATCH)
123 ctf_enum_value("SCHED_IDLE", SCHED_IDLE)
124 ctf_enum_value("SCHED_DEADLINE", SCHED_DEADLINE)
125 )
126 )
127 #endif
128
129 /*
130 * Tracepoint for calling kthread_stop, performed to end a kthread:
131 */
132 LTTNG_TRACEPOINT_EVENT(sched_kthread_stop,
133
134 TP_PROTO(struct task_struct *t),
135
136 TP_ARGS(t),
137
138 TP_FIELDS(
139 ctf_array_text(char, comm, t->comm, TASK_COMM_LEN)
140 ctf_integer(pid_t, tid, t->pid)
141 )
142 )
143
144 /*
145 * Tracepoint for the return value of the kthread stopping:
146 */
147 LTTNG_TRACEPOINT_EVENT(sched_kthread_stop_ret,
148
149 TP_PROTO(int ret),
150
151 TP_ARGS(ret),
152
153 TP_FIELDS(
154 ctf_integer(int, ret, ret)
155 )
156 )
157
158 /*
159 * Tracepoint for waking up a task:
160 */
161 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0) || \
162 LTTNG_RT_KERNEL_RANGE(4,1,10,11, 4,2,0,0))
163 LTTNG_TRACEPOINT_EVENT_CLASS(sched_wakeup_template,
164
165 TP_PROTO(struct task_struct *p),
166
167 TP_ARGS(p),
168
169 TP_FIELDS(
170 ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
171 ctf_integer(pid_t, tid, p->pid)
172 ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
173 ctf_integer(int, target_cpu, task_cpu(p))
174 )
175 )
176 #else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */
177 LTTNG_TRACEPOINT_EVENT_CLASS(sched_wakeup_template,
178
179 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
180 TP_PROTO(struct task_struct *p, int success),
181
182 TP_ARGS(p, success),
183 #else
184 TP_PROTO(struct rq *rq, struct task_struct *p, int success),
185
186 TP_ARGS(rq, p, success),
187 #endif
188
189 TP_FIELDS(
190 ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
191 ctf_integer(pid_t, tid, p->pid)
192 ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
193 ctf_integer(int, success, success)
194 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
195 ctf_integer(int, target_cpu, task_cpu(p))
196 #endif
197 )
198 )
199 #endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */
200
201 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0) || \
202 LTTNG_RT_KERNEL_RANGE(4,1,10,11, 4,2,0,0))
203
204 /*
205 * Tracepoint called when waking a task; this tracepoint is guaranteed to be
206 * called from the waking context.
207 */
208 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_waking,
209 TP_PROTO(struct task_struct *p),
210 TP_ARGS(p))
211
212 /*
213 * Tracepoint called when the task is actually woken; p->state == TASK_RUNNNG.
214 * It it not always called from the waking context.
215 */
216 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup,
217 TP_PROTO(struct task_struct *p),
218 TP_ARGS(p))
219
220 /*
221 * Tracepoint for waking up a new task:
222 */
223 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup_new,
224 TP_PROTO(struct task_struct *p),
225 TP_ARGS(p))
226
227 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
228
229 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup,
230 TP_PROTO(struct task_struct *p, int success),
231 TP_ARGS(p, success))
232
233 /*
234 * Tracepoint for waking up a new task:
235 */
236 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup_new,
237 TP_PROTO(struct task_struct *p, int success),
238 TP_ARGS(p, success))
239
240 #else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
241
242 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup,
243 TP_PROTO(struct rq *rq, struct task_struct *p, int success),
244 TP_ARGS(rq, p, success))
245
246 /*
247 * Tracepoint for waking up a new task:
248 */
249 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_wakeup_template, sched_wakeup_new,
250 TP_PROTO(struct rq *rq, struct task_struct *p, int success),
251 TP_ARGS(rq, p, success))
252
253 #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
254
255 /*
256 * Tracepoint for task switches, performed by the scheduler:
257 */
258 LTTNG_TRACEPOINT_EVENT(sched_switch,
259
260 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
261 TP_PROTO(bool preempt,
262 struct task_struct *prev,
263 struct task_struct *next),
264
265 TP_ARGS(preempt, prev, next),
266 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
267 TP_PROTO(struct task_struct *prev,
268 struct task_struct *next),
269
270 TP_ARGS(prev, next),
271 #else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
272 TP_PROTO(struct rq *rq, struct task_struct *prev,
273 struct task_struct *next),
274
275 TP_ARGS(rq, prev, next),
276 #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
277
278 TP_FIELDS(
279 ctf_array_text(char, prev_comm, prev->comm, TASK_COMM_LEN)
280 ctf_integer(pid_t, prev_tid, prev->pid)
281 ctf_integer(int, prev_prio, prev->prio - MAX_RT_PRIO)
282 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
283 ctf_integer(long, prev_state, __trace_sched_switch_state(preempt, prev))
284 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
285 ctf_integer(long, prev_state, __trace_sched_switch_state(prev))
286 #else
287 ctf_integer(long, prev_state, prev->state)
288 #endif
289 ctf_array_text(char, next_comm, next->comm, TASK_COMM_LEN)
290 ctf_integer(pid_t, next_tid, next->pid)
291 ctf_integer(int, next_prio, next->prio - MAX_RT_PRIO)
292 )
293 )
294
295 /*
296 * Tracepoint for a task being migrated:
297 */
298 LTTNG_TRACEPOINT_EVENT(sched_migrate_task,
299
300 TP_PROTO(struct task_struct *p, int dest_cpu),
301
302 TP_ARGS(p, dest_cpu),
303
304 TP_FIELDS(
305 ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
306 ctf_integer(pid_t, tid, p->pid)
307 ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
308 ctf_integer(int, orig_cpu, task_cpu(p))
309 ctf_integer(int, dest_cpu, dest_cpu)
310 )
311 )
312
313 LTTNG_TRACEPOINT_EVENT_CLASS(sched_process_template,
314
315 TP_PROTO(struct task_struct *p),
316
317 TP_ARGS(p),
318
319 TP_FIELDS(
320 ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
321 ctf_integer(pid_t, tid, p->pid)
322 ctf_integer(int, prio, p->prio - MAX_RT_PRIO)
323 )
324 )
325
326 /*
327 * Tracepoint for freeing a task:
328 */
329 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_process_template, sched_process_free,
330 TP_PROTO(struct task_struct *p),
331 TP_ARGS(p))
332
333
334 /*
335 * Tracepoint for a task exiting:
336 */
337 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_process_template, sched_process_exit,
338 TP_PROTO(struct task_struct *p),
339 TP_ARGS(p))
340
341 /*
342 * Tracepoint for waiting on task to unschedule:
343 */
344 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
345 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_process_template, sched_wait_task,
346 TP_PROTO(struct task_struct *p),
347 TP_ARGS(p))
348 #else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
349 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_process_template, sched_wait_task,
350 TP_PROTO(struct rq *rq, struct task_struct *p),
351 TP_ARGS(rq, p))
352 #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) */
353
354 /*
355 * Tracepoint for a waiting task:
356 */
357 LTTNG_TRACEPOINT_EVENT(sched_process_wait,
358
359 TP_PROTO(struct pid *pid),
360
361 TP_ARGS(pid),
362
363 TP_FIELDS(
364 ctf_array_text(char, comm, current->comm, TASK_COMM_LEN)
365 ctf_integer(pid_t, tid, pid_nr(pid))
366 ctf_integer(int, prio, current->prio - MAX_RT_PRIO)
367 )
368 )
369
370 /*
371 * Tracepoint for do_fork.
372 * Saving both TID and PID information, especially for the child, allows
373 * trace analyzers to distinguish between creation of a new process and
374 * creation of a new thread. Newly created processes will have child_tid
375 * == child_pid, while creation of a thread yields to child_tid !=
376 * child_pid.
377 */
378 LTTNG_TRACEPOINT_EVENT_CODE(sched_process_fork,
379
380 TP_PROTO(struct task_struct *parent, struct task_struct *child),
381
382 TP_ARGS(parent, child),
383
384 TP_locvar(
385 pid_t vtids[LTTNG_MAX_PID_NS_LEVEL];
386 unsigned int ns_level;
387 ),
388
389 TP_code_pre(
390 if (child) {
391 struct pid *child_pid;
392 unsigned int i;
393
394 child_pid = task_pid(child);
395 tp_locvar->ns_level =
396 min_t(unsigned int, child_pid->level + 1,
397 LTTNG_MAX_PID_NS_LEVEL);
398 for (i = 0; i < tp_locvar->ns_level; i++)
399 tp_locvar->vtids[i] = child_pid->numbers[i].nr;
400 }
401 ),
402
403 TP_FIELDS(
404 ctf_array_text(char, parent_comm, parent->comm, TASK_COMM_LEN)
405 ctf_integer(pid_t, parent_tid, parent->pid)
406 ctf_integer(pid_t, parent_pid, parent->tgid)
407 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
408 ctf_integer(unsigned int, parent_ns_inum,
409 ({
410 unsigned int parent_ns_inum = 0;
411
412 if (parent) {
413 struct pid_namespace *pid_ns;
414
415 pid_ns = task_active_pid_ns(parent);
416 if (pid_ns)
417 parent_ns_inum =
418 pid_ns->lttng_proc_inum;
419 }
420 parent_ns_inum;
421 }))
422 #endif
423 ctf_array_text(char, child_comm, child->comm, TASK_COMM_LEN)
424 ctf_integer(pid_t, child_tid, child->pid)
425 ctf_sequence(pid_t, vtids, tp_locvar->vtids, u8, tp_locvar->ns_level)
426 ctf_integer(pid_t, child_pid, child->tgid)
427 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
428 ctf_integer(unsigned int, child_ns_inum,
429 ({
430 unsigned int child_ns_inum = 0;
431
432 if (child) {
433 struct pid_namespace *pid_ns;
434
435 pid_ns = task_active_pid_ns(child);
436 if (pid_ns)
437 child_ns_inum =
438 pid_ns->lttng_proc_inum;
439 }
440 child_ns_inum;
441 }))
442 #endif
443 ctf_integer(int, prio, child->prio - MAX_RT_PRIO)
444 ctf_enum(lttng_sched_policy, unsigned int, policy, child->policy)
445 ctf_integer(int, nice, task_nice(child))
446 ctf_integer(unsigned int, rt_priority, child->rt_priority)
447 ctf_integer(u64, dl_runtime, child->dl.dl_runtime)
448 ctf_integer(u64, dl_deadline, child->dl.dl_deadline)
449 ctf_integer(u64, dl_period, child->dl.dl_period)
450 ),
451
452 TP_code_post()
453 )
454
455 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
456 /*
457 * Tracepoint for sending a signal:
458 */
459 LTTNG_TRACEPOINT_EVENT(sched_signal_send,
460
461 TP_PROTO(int sig, struct task_struct *p),
462
463 TP_ARGS(sig, p),
464
465 TP_FIELDS(
466 ctf_integer(int, sig, sig)
467 ctf_array_text(char, comm, p->comm, TASK_COMM_LEN)
468 ctf_integer(pid_t, tid, p->pid)
469 )
470 )
471 #endif
472
473 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
474 /*
475 * Tracepoint for exec:
476 */
477 LTTNG_TRACEPOINT_EVENT(sched_process_exec,
478
479 TP_PROTO(struct task_struct *p, pid_t old_pid,
480 struct linux_binprm *bprm),
481
482 TP_ARGS(p, old_pid, bprm),
483
484 TP_FIELDS(
485 ctf_string(filename, bprm->filename)
486 ctf_integer(pid_t, tid, p->pid)
487 ctf_integer(pid_t, old_tid, old_pid)
488 )
489 )
490 #endif
491
492 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
493 /*
494 * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
495 * adding sched_stat support to SCHED_FIFO/RR would be welcome.
496 */
497 LTTNG_TRACEPOINT_EVENT_CLASS(sched_stat_template,
498
499 TP_PROTO(struct task_struct *tsk, u64 delay),
500
501 TP_ARGS(tsk, delay),
502
503 TP_FIELDS(
504 ctf_array_text(char, comm, tsk->comm, TASK_COMM_LEN)
505 ctf_integer(pid_t, tid, tsk->pid)
506 ctf_integer(u64, delay, delay)
507 )
508 )
509
510
511 /*
512 * Tracepoint for accounting wait time (time the task is runnable
513 * but not actually running due to scheduler contention).
514 */
515 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_stat_template, sched_stat_wait,
516 TP_PROTO(struct task_struct *tsk, u64 delay),
517 TP_ARGS(tsk, delay))
518
519 /*
520 * Tracepoint for accounting sleep time (time the task is not runnable,
521 * including iowait, see below).
522 */
523 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_stat_template, sched_stat_sleep,
524 TP_PROTO(struct task_struct *tsk, u64 delay),
525 TP_ARGS(tsk, delay))
526
527 /*
528 * Tracepoint for accounting iowait time (time the task is not runnable
529 * due to waiting on IO to complete).
530 */
531 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_stat_template, sched_stat_iowait,
532 TP_PROTO(struct task_struct *tsk, u64 delay),
533 TP_ARGS(tsk, delay))
534
535 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
536 /*
537 * Tracepoint for accounting blocked time (time the task is in uninterruptible).
538 */
539 LTTNG_TRACEPOINT_EVENT_INSTANCE(sched_stat_template, sched_stat_blocked,
540 TP_PROTO(struct task_struct *tsk, u64 delay),
541 TP_ARGS(tsk, delay))
542 #endif
543
544 /*
545 * Tracepoint for accounting runtime (time the task is executing
546 * on a CPU).
547 */
548 LTTNG_TRACEPOINT_EVENT(sched_stat_runtime,
549
550 TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
551
552 TP_ARGS(tsk, runtime, vruntime),
553
554 TP_FIELDS(
555 ctf_array_text(char, comm, tsk->comm, TASK_COMM_LEN)
556 ctf_integer(pid_t, tid, tsk->pid)
557 ctf_integer(u64, runtime, runtime)
558 ctf_integer(u64, vruntime, vruntime)
559 )
560 )
561 #endif
562
563 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
564 /*
565 * Tracepoint for showing priority inheritance modifying a tasks
566 * priority.
567 */
568 LTTNG_TRACEPOINT_EVENT(sched_pi_setprio,
569
570 TP_PROTO(struct task_struct *tsk, int newprio),
571
572 TP_ARGS(tsk, newprio),
573
574 TP_FIELDS(
575 ctf_array_text(char, comm, tsk->comm, TASK_COMM_LEN)
576 ctf_integer(pid_t, tid, tsk->pid)
577 ctf_integer(int, oldprio, tsk->prio - MAX_RT_PRIO)
578 ctf_integer(int, newprio, newprio - MAX_RT_PRIO)
579 )
580 )
581 #endif
582
583 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0))
584 /*
585 * Tracepoint for priority changes of a task.
586 */
587 LTTNG_TRACEPOINT_EVENT(sched_update_prio,
588
589 TP_PROTO(struct task_struct *tsk),
590
591 TP_ARGS(tsk),
592
593 TP_FIELDS(
594 ctf_array_text(char, comm, tsk->comm, TASK_COMM_LEN)
595 ctf_integer(pid_t, tid, tsk->pid)
596 ctf_integer(int, prio, tsk->prio - MAX_RT_PRIO)
597 ctf_enum(lttng_sched_policy, unsigned int, policy, tsk->policy)
598 ctf_integer(int, nice, task_nice(tsk))
599 ctf_integer(unsigned int, rt_priority, tsk->rt_priority)
600 ctf_integer(u64, dl_runtime, tsk->dl.dl_runtime)
601 ctf_integer(u64, dl_deadline, tsk->dl.dl_deadline)
602 ctf_integer(u64, dl_period, tsk->dl.dl_period)
603 )
604 )
605 #endif
606
607 #endif /* LTTNG_TRACE_SCHED_H */
608
609 /* This part must be outside protection */
610 #include <probes/define_trace.h>
This page took 0.044044 seconds and 5 git commands to generate.