9d316b22388c6a66179ffb850cfc00413412bb7d
[safe/jmp/linux-2.6] / include / trace / events / sched.h
1 #undef TRACE_SYSTEM
2 #define TRACE_SYSTEM sched
3
4 #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
5 #define _TRACE_SCHED_H
6
7 #include <linux/sched.h>
8 #include <linux/tracepoint.h>
9
10 /*
11  * Tracepoint for calling kthread_stop, performed to end a kthread:
12  */
13 TRACE_EVENT(sched_kthread_stop,
14
15         TP_PROTO(struct task_struct *t),
16
17         TP_ARGS(t),
18
19         TP_STRUCT__entry(
20                 __array(        char,   comm,   TASK_COMM_LEN   )
21                 __field(        pid_t,  pid                     )
22         ),
23
24         TP_fast_assign(
25                 memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
26                 __entry->pid    = t->pid;
27         ),
28
29         TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
30 );
31
32 /*
33  * Tracepoint for the return value of the kthread stopping:
34  */
35 TRACE_EVENT(sched_kthread_stop_ret,
36
37         TP_PROTO(int ret),
38
39         TP_ARGS(ret),
40
41         TP_STRUCT__entry(
42                 __field(        int,    ret     )
43         ),
44
45         TP_fast_assign(
46                 __entry->ret    = ret;
47         ),
48
49         TP_printk("ret=%d", __entry->ret)
50 );
51
52 /*
53  * Tracepoint for waiting on task to unschedule:
54  *
55  * (NOTE: the 'rq' argument is not used by generic trace events,
56  *        but used by the latency tracer plugin. )
57  */
58 TRACE_EVENT(sched_wait_task,
59
60         TP_PROTO(struct rq *rq, struct task_struct *p),
61
62         TP_ARGS(rq, p),
63
64         TP_STRUCT__entry(
65                 __array(        char,   comm,   TASK_COMM_LEN   )
66                 __field(        pid_t,  pid                     )
67                 __field(        int,    prio                    )
68         ),
69
70         TP_fast_assign(
71                 memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
72                 __entry->pid    = p->pid;
73                 __entry->prio   = p->prio;
74         ),
75
76         TP_printk("comm=%s pid=%d prio=%d",
77                   __entry->comm, __entry->pid, __entry->prio)
78 );
79
80 /*
81  * Tracepoint for waking up a task:
82  *
83  * (NOTE: the 'rq' argument is not used by generic trace events,
84  *        but used by the latency tracer plugin. )
85  */
86 DECLARE_EVENT_CLASS(sched_wakeup_template,
87
88         TP_PROTO(struct rq *rq, struct task_struct *p, int success),
89
90         TP_ARGS(rq, p, success),
91
92         TP_STRUCT__entry(
93                 __array(        char,   comm,   TASK_COMM_LEN   )
94                 __field(        pid_t,  pid                     )
95                 __field(        int,    prio                    )
96                 __field(        int,    success                 )
97                 __field(        int,    target_cpu              )
98         ),
99
100         TP_fast_assign(
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);
106         ),
107
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)
111 );
112
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));
116
117 /*
118  * Tracepoint for waking up a new task:
119  *
120  * (NOTE: the 'rq' argument is not used by generic trace events,
121  *        but used by the latency tracer plugin. )
122  */
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));
126
127 /*
128  * Tracepoint for task switches, performed by the scheduler:
129  *
130  * (NOTE: the 'rq' argument is not used by generic trace events,
131  *        but used by the latency tracer plugin. )
132  */
133 TRACE_EVENT(sched_switch,
134
135         TP_PROTO(struct rq *rq, struct task_struct *prev,
136                  struct task_struct *next),
137
138         TP_ARGS(rq, prev, next),
139
140         TP_STRUCT__entry(
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                       )
148         ),
149
150         TP_fast_assign(
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;
158         ),
159
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" },
166                                 { 128, "W" }) : "R",
167                 __entry->next_comm, __entry->next_pid, __entry->next_prio)
168 );
169
170 /*
171  * Tracepoint for a task being migrated:
172  */
173 TRACE_EVENT(sched_migrate_task,
174
175         TP_PROTO(struct task_struct *p, int dest_cpu),
176
177         TP_ARGS(p, dest_cpu),
178
179         TP_STRUCT__entry(
180                 __array(        char,   comm,   TASK_COMM_LEN   )
181                 __field(        pid_t,  pid                     )
182                 __field(        int,    prio                    )
183                 __field(        int,    orig_cpu                )
184                 __field(        int,    dest_cpu                )
185         ),
186
187         TP_fast_assign(
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;
193         ),
194
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)
198 );
199
200 DECLARE_EVENT_CLASS(sched_process_template,
201
202         TP_PROTO(struct task_struct *p),
203
204         TP_ARGS(p),
205
206         TP_STRUCT__entry(
207                 __array(        char,   comm,   TASK_COMM_LEN   )
208                 __field(        pid_t,  pid                     )
209                 __field(        int,    prio                    )
210         ),
211
212         TP_fast_assign(
213                 memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
214                 __entry->pid            = p->pid;
215                 __entry->prio           = p->prio;
216         ),
217
218         TP_printk("comm=%s pid=%d prio=%d",
219                   __entry->comm, __entry->pid, __entry->prio)
220 );
221
222 /*
223  * Tracepoint for freeing a task:
224  */
225 DEFINE_EVENT(sched_process_template, sched_process_free,
226              TP_PROTO(struct task_struct *p),
227              TP_ARGS(p));
228              
229
230 /*
231  * Tracepoint for a task exiting:
232  */
233 DEFINE_EVENT(sched_process_template, sched_process_exit,
234              TP_PROTO(struct task_struct *p),
235              TP_ARGS(p));
236
237 /*
238  * Tracepoint for a waiting task:
239  */
240 TRACE_EVENT(sched_process_wait,
241
242         TP_PROTO(struct pid *pid),
243
244         TP_ARGS(pid),
245
246         TP_STRUCT__entry(
247                 __array(        char,   comm,   TASK_COMM_LEN   )
248                 __field(        pid_t,  pid                     )
249                 __field(        int,    prio                    )
250         ),
251
252         TP_fast_assign(
253                 memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
254                 __entry->pid            = pid_nr(pid);
255                 __entry->prio           = current->prio;
256         ),
257
258         TP_printk("comm=%s pid=%d prio=%d",
259                   __entry->comm, __entry->pid, __entry->prio)
260 );
261
262 /*
263  * Tracepoint for do_fork:
264  */
265 TRACE_EVENT(sched_process_fork,
266
267         TP_PROTO(struct task_struct *parent, struct task_struct *child),
268
269         TP_ARGS(parent, child),
270
271         TP_STRUCT__entry(
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                       )
276         ),
277
278         TP_fast_assign(
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;
283         ),
284
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)
288 );
289
290 /*
291  * Tracepoint for sending a signal:
292  */
293 TRACE_EVENT(sched_signal_send,
294
295         TP_PROTO(int sig, struct task_struct *p),
296
297         TP_ARGS(sig, p),
298
299         TP_STRUCT__entry(
300                 __field(        int,    sig                     )
301                 __array(        char,   comm,   TASK_COMM_LEN   )
302                 __field(        pid_t,  pid                     )
303         ),
304
305         TP_fast_assign(
306                 memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
307                 __entry->pid    = p->pid;
308                 __entry->sig    = sig;
309         ),
310
311         TP_printk("sig=%d comm=%s pid=%d",
312                   __entry->sig, __entry->comm, __entry->pid)
313 );
314
315 /*
316  * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
317  *     adding sched_stat support to SCHED_FIFO/RR would be welcome.
318  */
319 DECLARE_EVENT_CLASS(sched_stat_template,
320
321         TP_PROTO(struct task_struct *tsk, u64 delay),
322
323         TP_ARGS(tsk, delay),
324
325         TP_STRUCT__entry(
326                 __array( char,  comm,   TASK_COMM_LEN   )
327                 __field( pid_t, pid                     )
328                 __field( u64,   delay                   )
329         ),
330
331         TP_fast_assign(
332                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
333                 __entry->pid    = tsk->pid;
334                 __entry->delay  = delay;
335         )
336         TP_perf_assign(
337                 __perf_count(delay);
338         ),
339
340         TP_printk("comm=%s pid=%d delay=%Lu [ns]",
341                         __entry->comm, __entry->pid,
342                         (unsigned long long)__entry->delay)
343 );
344
345
346 /*
347  * Tracepoint for accounting wait time (time the task is runnable
348  * but not actually running due to scheduler contention).
349  */
350 DEFINE_EVENT(sched_stat_template, sched_stat_wait,
351              TP_PROTO(struct task_struct *tsk, u64 delay),
352              TP_ARGS(tsk, delay));
353
354 /*
355  * Tracepoint for accounting sleep time (time the task is not runnable,
356  * including iowait, see below).
357  */
358 DEFINE_EVENT(sched_stat_template, sched_stat_sleep,
359              TP_PROTO(struct task_struct *tsk, u64 delay),
360              TP_ARGS(tsk, delay));
361
362 /*
363  * Tracepoint for accounting iowait time (time the task is not runnable
364  * due to waiting on IO to complete).
365  */
366 DEFINE_EVENT(sched_stat_template, sched_stat_iowait,
367              TP_PROTO(struct task_struct *tsk, u64 delay),
368              TP_ARGS(tsk, delay));
369
370 /*
371  * Tracepoint for accounting runtime (time the task is executing
372  * on a CPU).
373  */
374 TRACE_EVENT(sched_stat_runtime,
375
376         TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
377
378         TP_ARGS(tsk, runtime, vruntime),
379
380         TP_STRUCT__entry(
381                 __array( char,  comm,   TASK_COMM_LEN   )
382                 __field( pid_t, pid                     )
383                 __field( u64,   runtime                 )
384                 __field( u64,   vruntime                        )
385         ),
386
387         TP_fast_assign(
388                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
389                 __entry->pid            = tsk->pid;
390                 __entry->runtime        = runtime;
391                 __entry->vruntime       = vruntime;
392         )
393         TP_perf_assign(
394                 __perf_count(runtime);
395         ),
396
397         TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
398                         __entry->comm, __entry->pid,
399                         (unsigned long long)__entry->runtime,
400                         (unsigned long long)__entry->vruntime)
401 );
402
403 #endif /* _TRACE_SCHED_H */
404
405 /* This part must be outside protection */
406 #include <trace/define_trace.h>