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>
11 * Tracepoint for calling kthread_stop, performed to end a kthread:
13 TRACE_EVENT(sched_kthread_stop
,
15 TP_PROTO(struct task_struct
*t
),
20 __array( char, comm
, TASK_COMM_LEN
)
25 memcpy(__entry
->comm
, t
->comm
, TASK_COMM_LEN
);
26 __entry
->pid
= t
->pid
;
29 TP_printk("comm=%s pid=%d", __entry
->comm
, __entry
->pid
)
33 * Tracepoint for the return value of the kthread stopping:
35 TRACE_EVENT(sched_kthread_stop_ret
,
49 TP_printk("ret=%d", __entry
->ret
)
53 * Tracepoint for waiting on task to unschedule:
55 * (NOTE: the 'rq' argument is not used by generic trace events,
56 * but used by the latency tracer plugin. )
58 TRACE_EVENT(sched_wait_task
,
60 TP_PROTO(struct rq
*rq
, struct task_struct
*p
),
65 __array( char, comm
, TASK_COMM_LEN
)
71 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
72 __entry
->pid
= p
->pid
;
73 __entry
->prio
= p
->prio
;
76 TP_printk("comm=%s pid=%d prio=%d",
77 __entry
->comm
, __entry
->pid
, __entry
->prio
)
81 * Tracepoint for waking up a task:
83 * (NOTE: the 'rq' argument is not used by generic trace events,
84 * but used by the latency tracer plugin. )
86 DECLARE_EVENT_CLASS(sched_wakeup_template
,
88 TP_PROTO(struct rq
*rq
, struct task_struct
*p
, int success
),
90 TP_ARGS(rq
, p
, success
),
93 __array( char, comm
, TASK_COMM_LEN
)
96 __field( int, success
)
97 __field( int, target_cpu
)
101 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
102 __entry
->pid
= p
->pid
;
103 __entry
->prio
= p
->prio
;
104 __entry
->success
= success
;
105 __entry
->target_cpu
= task_cpu(p
);
108 TP_printk("comm=%s pid=%d prio=%d success=%d target_cpu=%03d",
109 __entry
->comm
, __entry
->pid
, __entry
->prio
,
110 __entry
->success
, __entry
->target_cpu
)
113 DEFINE_EVENT(sched_wakeup_template
, sched_wakeup
,
114 TP_PROTO(struct rq
*rq
, struct task_struct
*p
, int success
),
115 TP_ARGS(rq
, p
, success
));
118 * Tracepoint for waking up a new task:
120 * (NOTE: the 'rq' argument is not used by generic trace events,
121 * but used by the latency tracer plugin. )
123 DEFINE_EVENT(sched_wakeup_template
, sched_wakeup_new
,
124 TP_PROTO(struct rq
*rq
, struct task_struct
*p
, int success
),
125 TP_ARGS(rq
, p
, success
));
128 * Tracepoint for task switches, performed by the scheduler:
130 * (NOTE: the 'rq' argument is not used by generic trace events,
131 * but used by the latency tracer plugin. )
133 TRACE_EVENT(sched_switch
,
135 TP_PROTO(struct rq
*rq
, struct task_struct
*prev
,
136 struct task_struct
*next
),
138 TP_ARGS(rq
, prev
, next
),
141 __array( char, prev_comm
, TASK_COMM_LEN
)
142 __field( pid_t
, prev_pid
)
143 __field( int, prev_prio
)
144 __field( long, prev_state
)
145 __array( char, next_comm
, TASK_COMM_LEN
)
146 __field( pid_t
, next_pid
)
147 __field( int, next_prio
)
151 memcpy(__entry
->next_comm
, next
->comm
, TASK_COMM_LEN
);
152 __entry
->prev_pid
= prev
->pid
;
153 __entry
->prev_prio
= prev
->prio
;
154 __entry
->prev_state
= prev
->state
;
155 memcpy(__entry
->prev_comm
, prev
->comm
, TASK_COMM_LEN
);
156 __entry
->next_pid
= next
->pid
;
157 __entry
->next_prio
= next
->prio
;
160 TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s ==> next_comm=%s next_pid=%d next_prio=%d",
161 __entry
->prev_comm
, __entry
->prev_pid
, __entry
->prev_prio
,
162 __entry
->prev_state
?
163 __print_flags(__entry
->prev_state
, "|",
164 { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" },
165 { 16, "Z" }, { 32, "X" }, { 64, "x" },
167 __entry
->next_comm
, __entry
->next_pid
, __entry
->next_prio
)
171 * Tracepoint for a task being migrated:
173 TRACE_EVENT(sched_migrate_task
,
175 TP_PROTO(struct task_struct
*p
, int dest_cpu
),
177 TP_ARGS(p
, dest_cpu
),
180 __array( char, comm
, TASK_COMM_LEN
)
181 __field( pid_t
, pid
)
183 __field( int, orig_cpu
)
184 __field( int, dest_cpu
)
188 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
189 __entry
->pid
= p
->pid
;
190 __entry
->prio
= p
->prio
;
191 __entry
->orig_cpu
= task_cpu(p
);
192 __entry
->dest_cpu
= dest_cpu
;
195 TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d",
196 __entry
->comm
, __entry
->pid
, __entry
->prio
,
197 __entry
->orig_cpu
, __entry
->dest_cpu
)
200 DECLARE_EVENT_CLASS(sched_process_template
,
202 TP_PROTO(struct task_struct
*p
),
207 __array( char, comm
, TASK_COMM_LEN
)
208 __field( pid_t
, pid
)
213 memcpy(__entry
->comm
, p
->comm
, TASK_COMM_LEN
);
214 __entry
->pid
= p
->pid
;
215 __entry
->prio
= p
->prio
;
218 TP_printk("comm=%s pid=%d prio=%d",
219 __entry
->comm
, __entry
->pid
, __entry
->prio
)
223 * Tracepoint for freeing a task:
225 DEFINE_EVENT(sched_process_template
, sched_process_free
,
226 TP_PROTO(struct task_struct
*p
),
231 * Tracepoint for a task exiting:
233 DEFINE_EVENT(sched_process_template
, sched_process_exit
,
234 TP_PROTO(struct task_struct
*p
),
238 * Tracepoint for a waiting task:
240 TRACE_EVENT(sched_process_wait
,
242 TP_PROTO(struct pid
*pid
),
247 __array( char, comm
, TASK_COMM_LEN
)
248 __field( pid_t
, pid
)
253 memcpy(__entry
->comm
, current
->comm
, TASK_COMM_LEN
);
254 __entry
->pid
= pid_nr(pid
);
255 __entry
->prio
= current
->prio
;
258 TP_printk("comm=%s pid=%d prio=%d",
259 __entry
->comm
, __entry
->pid
, __entry
->prio
)
263 * Tracepoint for do_fork:
265 TRACE_EVENT(sched_process_fork
,
267 TP_PROTO(struct task_struct
*parent
, struct task_struct
*child
),
269 TP_ARGS(parent
, child
),
272 __array( char, parent_comm
, TASK_COMM_LEN
)
273 __field( pid_t
, parent_pid
)
274 __array( char, child_comm
, TASK_COMM_LEN
)
275 __field( pid_t
, child_pid
)
279 memcpy(__entry
->parent_comm
, parent
->comm
, TASK_COMM_LEN
);
280 __entry
->parent_pid
= parent
->pid
;
281 memcpy(__entry
->child_comm
, child
->comm
, TASK_COMM_LEN
);
282 __entry
->child_pid
= child
->pid
;
285 TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d",
286 __entry
->parent_comm
, __entry
->parent_pid
,
287 __entry
->child_comm
, __entry
->child_pid
)
291 * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
292 * adding sched_stat support to SCHED_FIFO/RR would be welcome.
294 DECLARE_EVENT_CLASS(sched_stat_template
,
296 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
301 __array( char, comm
, TASK_COMM_LEN
)
302 __field( pid_t
, pid
)
303 __field( u64
, delay
)
307 memcpy(__entry
->comm
, tsk
->comm
, TASK_COMM_LEN
);
308 __entry
->pid
= tsk
->pid
;
309 __entry
->delay
= delay
;
315 TP_printk("comm=%s pid=%d delay=%Lu [ns]",
316 __entry
->comm
, __entry
->pid
,
317 (unsigned long long)__entry
->delay
)
322 * Tracepoint for accounting wait time (time the task is runnable
323 * but not actually running due to scheduler contention).
325 DEFINE_EVENT(sched_stat_template
, sched_stat_wait
,
326 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
327 TP_ARGS(tsk
, delay
));
330 * Tracepoint for accounting sleep time (time the task is not runnable,
331 * including iowait, see below).
333 DEFINE_EVENT(sched_stat_template
, sched_stat_sleep
,
334 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
335 TP_ARGS(tsk
, delay
));
338 * Tracepoint for accounting iowait time (time the task is not runnable
339 * due to waiting on IO to complete).
341 DEFINE_EVENT(sched_stat_template
, sched_stat_iowait
,
342 TP_PROTO(struct task_struct
*tsk
, u64 delay
),
343 TP_ARGS(tsk
, delay
));
346 * Tracepoint for accounting runtime (time the task is executing
349 TRACE_EVENT(sched_stat_runtime
,
351 TP_PROTO(struct task_struct
*tsk
, u64 runtime
, u64 vruntime
),
353 TP_ARGS(tsk
, runtime
, vruntime
),
356 __array( char, comm
, TASK_COMM_LEN
)
357 __field( pid_t
, pid
)
358 __field( u64
, runtime
)
359 __field( u64
, vruntime
)
363 memcpy(__entry
->comm
, tsk
->comm
, TASK_COMM_LEN
);
364 __entry
->pid
= tsk
->pid
;
365 __entry
->runtime
= runtime
;
366 __entry
->vruntime
= vruntime
;
369 __perf_count(runtime
);
372 TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
373 __entry
->comm
, __entry
->pid
,
374 (unsigned long long)__entry
->runtime
,
375 (unsigned long long)__entry
->vruntime
)
378 #endif /* _TRACE_SCHED_H */
380 /* This part must be outside protection */
381 #include <trace/define_trace.h>