2 #define TRACE_SYSTEM sched
4 #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
7 #include <linux/sched.h>
8 #include <linux/tracepoint.h>
9 #include <linux/binfmts.h>
12 * Tracepoint for calling kthread_stop, performed to end a kthread:
14 TRACE_EVENT(sched_kthread_stop
,
16 TP_PROTO(struct task_struct
*t
),
21 __array( char, comm
, TASK_COMM_LEN
)
26 memcpy(__entry
->comm
, t
->comm
, TASK_COMM_LEN
);
27 __entry
->pid
= t
->pid
;
30 TP_printk("comm=%s pid=%d", __entry
->comm
, __entry
->pid
)
34 * Tracepoint for the return value of the kthread stopping:
36 TRACE_EVENT(sched_kthread_stop_ret
,
50 TP_printk("ret=%d", __entry
->ret
)
54 * Tracepoint for waking up a task:
56 DECLARE_EVENT_CLASS(sched_wakeup_template
,
58 TP_PROTO(struct task_struct
*p
, int success
),
60 TP_ARGS(__perf_task(p
), success
),
63 __array( char, comm
, TASK_COMM_LEN
)
66 __field( int, success
)
67 __field( int, target_cpu
)
71 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
72 __entry
->pid
= p
->pid
;
73 __entry
->prio
= p
->prio
;
74 __entry
->success
= success
;
75 __entry
->target_cpu
= task_cpu(p
);
78 TP_printk("comm=%s pid=%d prio=%d success=%d target_cpu=%03d",
79 __entry
->comm
, __entry
->pid
, __entry
->prio
,
80 __entry
->success
, __entry
->target_cpu
)
83 DEFINE_EVENT(sched_wakeup_template
, sched_wakeup
,
84 TP_PROTO(struct task_struct
*p
, int success
),
88 * Tracepoint for waking up a new task:
90 DEFINE_EVENT(sched_wakeup_template
, sched_wakeup_new
,
91 TP_PROTO(struct task_struct
*p
, int success
),
94 #ifdef CREATE_TRACE_POINTS
95 static inline long __trace_sched_switch_state(struct task_struct
*p
)
97 long state
= p
->state
;
101 * For all intents and purposes a preempted task is a running task.
103 if (task_thread_info(p
)->preempt_count
& PREEMPT_ACTIVE
)
104 state
= TASK_RUNNING
| TASK_STATE_MAX
;
112 * Tracepoint for task switches, performed by the scheduler:
114 TRACE_EVENT(sched_switch
,
116 TP_PROTO(struct task_struct
*prev
,
117 struct task_struct
*next
),
122 __array( char, prev_comm
, TASK_COMM_LEN
)
123 __field( pid_t
, prev_pid
)
124 __field( int, prev_prio
)
125 __field( long, prev_state
)
126 __array( char, next_comm
, TASK_COMM_LEN
)
127 __field( pid_t
, next_pid
)
128 __field( int, next_prio
)
132 memcpy(__entry
->next_comm
, next
->comm
, TASK_COMM_LEN
);
133 __entry
->prev_pid
= prev
->pid
;
134 __entry
->prev_prio
= prev
->prio
;
135 __entry
->prev_state
= __trace_sched_switch_state(prev
);
136 memcpy(__entry
->prev_comm
, prev
->comm
, TASK_COMM_LEN
);
137 __entry
->next_pid
= next
->pid
;
138 __entry
->next_prio
= next
->prio
;
141 TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d",
142 __entry
->prev_comm
, __entry
->prev_pid
, __entry
->prev_prio
,
143 __entry
->prev_state
& (TASK_STATE_MAX
-1) ?
144 __print_flags(__entry
->prev_state
& (TASK_STATE_MAX
-1), "|",
145 { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" },
146 { 16, "Z" }, { 32, "X" }, { 64, "x" },
147 { 128, "K" }, { 256, "W" }, { 512, "P" }) : "R",
148 __entry
->prev_state
& TASK_STATE_MAX
? "+" : "",
149 __entry
->next_comm
, __entry
->next_pid
, __entry
->next_prio
)
153 * Tracepoint for a task being migrated:
155 TRACE_EVENT(sched_migrate_task
,
157 TP_PROTO(struct task_struct
*p
, int dest_cpu
),
159 TP_ARGS(p
, dest_cpu
),
162 __array( char, comm
, TASK_COMM_LEN
)
163 __field( pid_t
, pid
)
165 __field( int, orig_cpu
)
166 __field( int, dest_cpu
)
170 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
171 __entry
->pid
= p
->pid
;
172 __entry
->prio
= p
->prio
;
173 __entry
->orig_cpu
= task_cpu(p
);
174 __entry
->dest_cpu
= dest_cpu
;
177 TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d",
178 __entry
->comm
, __entry
->pid
, __entry
->prio
,
179 __entry
->orig_cpu
, __entry
->dest_cpu
)
182 DECLARE_EVENT_CLASS(sched_process_template
,
184 TP_PROTO(struct task_struct
*p
),
189 __array( char, comm
, TASK_COMM_LEN
)
190 __field( pid_t
, pid
)
195 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
196 __entry
->pid
= p
->pid
;
197 __entry
->prio
= p
->prio
;
200 TP_printk("comm=%s pid=%d prio=%d",
201 __entry
->comm
, __entry
->pid
, __entry
->prio
)
205 * Tracepoint for freeing a task:
207 DEFINE_EVENT(sched_process_template
, sched_process_free
,
208 TP_PROTO(struct task_struct
*p
),
213 * Tracepoint for a task exiting:
215 DEFINE_EVENT(sched_process_template
, sched_process_exit
,
216 TP_PROTO(struct task_struct
*p
),
220 * Tracepoint for waiting on task to unschedule:
222 DEFINE_EVENT(sched_process_template
, sched_wait_task
,
223 TP_PROTO(struct task_struct
*p
),
227 * Tracepoint for a waiting task:
229 TRACE_EVENT(sched_process_wait
,
231 TP_PROTO(struct pid
*pid
),
236 __array( char, comm
, TASK_COMM_LEN
)
237 __field( pid_t
, pid
)
242 memcpy(__entry
->comm
, current
->comm
, TASK_COMM_LEN
);
243 __entry
->pid
= pid_nr(pid
);
244 __entry
->prio
= current
->prio
;
247 TP_printk("comm=%s pid=%d prio=%d",
248 __entry
->comm
, __entry
->pid
, __entry
->prio
)
252 * Tracepoint for do_fork:
254 TRACE_EVENT(sched_process_fork
,
256 TP_PROTO(struct task_struct
*parent
, struct task_struct
*child
),
258 TP_ARGS(parent
, child
),
261 __array( char, parent_comm
, TASK_COMM_LEN
)
262 __field( pid_t
, parent_pid
)
263 __array( char, child_comm
, TASK_COMM_LEN
)
264 __field( pid_t
, child_pid
)
268 memcpy(__entry
->parent_comm
, parent
->comm
, TASK_COMM_LEN
);
269 __entry
->parent_pid
= parent
->pid
;
270 memcpy(__entry
->child_comm
, child
->comm
, TASK_COMM_LEN
);
271 __entry
->child_pid
= child
->pid
;
274 TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d",
275 __entry
->parent_comm
, __entry
->parent_pid
,
276 __entry
->child_comm
, __entry
->child_pid
)
280 * Tracepoint for exec:
282 TRACE_EVENT(sched_process_exec
,
284 TP_PROTO(struct task_struct
*p
, pid_t old_pid
,
285 struct linux_binprm
*bprm
),
287 TP_ARGS(p
, old_pid
, bprm
),
290 __string( filename
, bprm
->filename
)
291 __field( pid_t
, pid
)
292 __field( pid_t
, old_pid
)
296 __assign_str(filename
, bprm
->filename
);
297 __entry
->pid
= p
->pid
;
298 __entry
->old_pid
= old_pid
;
301 TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename
),
302 __entry
->pid
, __entry
->old_pid
)
306 * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
307 * adding sched_stat support to SCHED_FIFO/RR would be welcome.
309 DECLARE_EVENT_CLASS(sched_stat_template
,
311 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
313 TP_ARGS(__perf_task(tsk
), __perf_count(delay
)),
316 __array( char, comm
, TASK_COMM_LEN
)
317 __field( pid_t
, pid
)
318 __field( u64
, delay
)
322 memcpy(__entry
->comm
, tsk
->comm
, TASK_COMM_LEN
);
323 __entry
->pid
= tsk
->pid
;
324 __entry
->delay
= delay
;
327 TP_printk("comm=%s pid=%d delay=%Lu [ns]",
328 __entry
->comm
, __entry
->pid
,
329 (unsigned long long)__entry
->delay
)
334 * Tracepoint for accounting wait time (time the task is runnable
335 * but not actually running due to scheduler contention).
337 DEFINE_EVENT(sched_stat_template
, sched_stat_wait
,
338 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
339 TP_ARGS(tsk
, delay
));
342 * Tracepoint for accounting sleep time (time the task is not runnable,
343 * including iowait, see below).
345 DEFINE_EVENT(sched_stat_template
, sched_stat_sleep
,
346 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
347 TP_ARGS(tsk
, delay
));
350 * Tracepoint for accounting iowait time (time the task is not runnable
351 * due to waiting on IO to complete).
353 DEFINE_EVENT(sched_stat_template
, sched_stat_iowait
,
354 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
355 TP_ARGS(tsk
, delay
));
358 * Tracepoint for accounting blocked time (time the task is in uninterruptible).
360 DEFINE_EVENT(sched_stat_template
, sched_stat_blocked
,
361 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
362 TP_ARGS(tsk
, delay
));
365 * Tracepoint for accounting runtime (time the task is executing
368 DECLARE_EVENT_CLASS(sched_stat_runtime
,
370 TP_PROTO(struct task_struct
*tsk
, u64 runtime
, u64 vruntime
),
372 TP_ARGS(tsk
, __perf_count(runtime
), vruntime
),
375 __array( char, comm
, TASK_COMM_LEN
)
376 __field( pid_t
, pid
)
377 __field( u64
, runtime
)
378 __field( u64
, vruntime
)
382 memcpy(__entry
->comm
, tsk
->comm
, TASK_COMM_LEN
);
383 __entry
->pid
= tsk
->pid
;
384 __entry
->runtime
= runtime
;
385 __entry
->vruntime
= vruntime
;
388 TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
389 __entry
->comm
, __entry
->pid
,
390 (unsigned long long)__entry
->runtime
,
391 (unsigned long long)__entry
->vruntime
)
394 DEFINE_EVENT(sched_stat_runtime
, sched_stat_runtime
,
395 TP_PROTO(struct task_struct
*tsk
, u64 runtime
, u64 vruntime
),
396 TP_ARGS(tsk
, runtime
, vruntime
));
399 * Tracepoint for showing priority inheritance modifying a tasks
402 TRACE_EVENT(sched_pi_setprio
,
404 TP_PROTO(struct task_struct
*tsk
, int newprio
),
406 TP_ARGS(tsk
, newprio
),
409 __array( char, comm
, TASK_COMM_LEN
)
410 __field( pid_t
, pid
)
411 __field( int, oldprio
)
412 __field( int, newprio
)
416 memcpy(__entry
->comm
, tsk
->comm
, TASK_COMM_LEN
);
417 __entry
->pid
= tsk
->pid
;
418 __entry
->oldprio
= tsk
->prio
;
419 __entry
->newprio
= newprio
;
422 TP_printk("comm=%s pid=%d oldprio=%d newprio=%d",
423 __entry
->comm
, __entry
->pid
,
424 __entry
->oldprio
, __entry
->newprio
)
427 #endif /* _TRACE_SCHED_H */
429 /* This part must be outside protection */
430 #include <trace/define_trace.h>