1d0b6e04aSLi Zefan #undef TRACE_SYSTEM 2d0b6e04aSLi Zefan #define TRACE_SYSTEM sched 3d0b6e04aSLi Zefan 4ad8d75ffSSteven Rostedt #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ) 5ad8d75ffSSteven Rostedt #define _TRACE_SCHED_H 6ad8d75ffSSteven Rostedt 7ad8d75ffSSteven Rostedt #include <linux/sched.h> 8ad8d75ffSSteven Rostedt #include <linux/tracepoint.h> 9ad8d75ffSSteven Rostedt 10ad8d75ffSSteven Rostedt /* 11ad8d75ffSSteven Rostedt * Tracepoint for calling kthread_stop, performed to end a kthread: 12ad8d75ffSSteven Rostedt */ 13ad8d75ffSSteven Rostedt TRACE_EVENT(sched_kthread_stop, 14ad8d75ffSSteven Rostedt 15ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *t), 16ad8d75ffSSteven Rostedt 17ad8d75ffSSteven Rostedt TP_ARGS(t), 18ad8d75ffSSteven Rostedt 19ad8d75ffSSteven Rostedt TP_STRUCT__entry( 20ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 21ad8d75ffSSteven Rostedt __field( pid_t, pid ) 22ad8d75ffSSteven Rostedt ), 23ad8d75ffSSteven Rostedt 24ad8d75ffSSteven Rostedt TP_fast_assign( 25ad8d75ffSSteven Rostedt memcpy(__entry->comm, t->comm, TASK_COMM_LEN); 26ad8d75ffSSteven Rostedt __entry->pid = t->pid; 27ad8d75ffSSteven Rostedt ), 28ad8d75ffSSteven Rostedt 29ad8d75ffSSteven Rostedt TP_printk("task %s:%d", __entry->comm, __entry->pid) 30ad8d75ffSSteven Rostedt ); 31ad8d75ffSSteven Rostedt 32ad8d75ffSSteven Rostedt /* 33ad8d75ffSSteven Rostedt * Tracepoint for the return value of the kthread stopping: 34ad8d75ffSSteven Rostedt */ 35ad8d75ffSSteven Rostedt TRACE_EVENT(sched_kthread_stop_ret, 36ad8d75ffSSteven Rostedt 37ad8d75ffSSteven Rostedt TP_PROTO(int ret), 38ad8d75ffSSteven Rostedt 39ad8d75ffSSteven Rostedt TP_ARGS(ret), 40ad8d75ffSSteven Rostedt 41ad8d75ffSSteven Rostedt TP_STRUCT__entry( 42ad8d75ffSSteven Rostedt __field( int, ret ) 43ad8d75ffSSteven Rostedt ), 44ad8d75ffSSteven Rostedt 45ad8d75ffSSteven Rostedt TP_fast_assign( 46ad8d75ffSSteven Rostedt __entry->ret = ret; 47ad8d75ffSSteven Rostedt ), 48ad8d75ffSSteven Rostedt 49ad8d75ffSSteven Rostedt TP_printk("ret %d", __entry->ret) 50ad8d75ffSSteven Rostedt ); 51ad8d75ffSSteven Rostedt 52ad8d75ffSSteven Rostedt /* 53ad8d75ffSSteven Rostedt * Tracepoint for waiting on task to unschedule: 54ad8d75ffSSteven Rostedt * 55ad8d75ffSSteven Rostedt * (NOTE: the 'rq' argument is not used by generic trace events, 56ad8d75ffSSteven Rostedt * but used by the latency tracer plugin. ) 57ad8d75ffSSteven Rostedt */ 58ad8d75ffSSteven Rostedt TRACE_EVENT(sched_wait_task, 59ad8d75ffSSteven Rostedt 60ad8d75ffSSteven Rostedt TP_PROTO(struct rq *rq, struct task_struct *p), 61ad8d75ffSSteven Rostedt 62ad8d75ffSSteven Rostedt TP_ARGS(rq, p), 63ad8d75ffSSteven Rostedt 64ad8d75ffSSteven Rostedt TP_STRUCT__entry( 65ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 66ad8d75ffSSteven Rostedt __field( pid_t, pid ) 67ad8d75ffSSteven Rostedt __field( int, prio ) 68ad8d75ffSSteven Rostedt ), 69ad8d75ffSSteven Rostedt 70ad8d75ffSSteven Rostedt TP_fast_assign( 71ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 72ad8d75ffSSteven Rostedt __entry->pid = p->pid; 73ad8d75ffSSteven Rostedt __entry->prio = p->prio; 74ad8d75ffSSteven Rostedt ), 75ad8d75ffSSteven Rostedt 76ad8d75ffSSteven Rostedt TP_printk("task %s:%d [%d]", 77ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 78ad8d75ffSSteven Rostedt ); 79ad8d75ffSSteven Rostedt 80ad8d75ffSSteven Rostedt /* 81ad8d75ffSSteven Rostedt * Tracepoint for waking up a task: 82ad8d75ffSSteven Rostedt * 83ad8d75ffSSteven Rostedt * (NOTE: the 'rq' argument is not used by generic trace events, 84ad8d75ffSSteven Rostedt * but used by the latency tracer plugin. ) 85ad8d75ffSSteven Rostedt */ 86ad8d75ffSSteven Rostedt TRACE_EVENT(sched_wakeup, 87ad8d75ffSSteven Rostedt 88ad8d75ffSSteven Rostedt TP_PROTO(struct rq *rq, struct task_struct *p, int success), 89ad8d75ffSSteven Rostedt 90ad8d75ffSSteven Rostedt TP_ARGS(rq, p, success), 91ad8d75ffSSteven Rostedt 92ad8d75ffSSteven Rostedt TP_STRUCT__entry( 93ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 94ad8d75ffSSteven Rostedt __field( pid_t, pid ) 95ad8d75ffSSteven Rostedt __field( int, prio ) 96ad8d75ffSSteven Rostedt __field( int, success ) 97f0693c8bSSteven Rostedt __field( int, cpu ) 98ad8d75ffSSteven Rostedt ), 99ad8d75ffSSteven Rostedt 100ad8d75ffSSteven Rostedt TP_fast_assign( 101ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 102ad8d75ffSSteven Rostedt __entry->pid = p->pid; 103ad8d75ffSSteven Rostedt __entry->prio = p->prio; 104ad8d75ffSSteven Rostedt __entry->success = success; 105f0693c8bSSteven Rostedt __entry->cpu = task_cpu(p); 106ad8d75ffSSteven Rostedt ), 107ad8d75ffSSteven Rostedt 108f0693c8bSSteven Rostedt TP_printk("task %s:%d [%d] success=%d [%03d]", 109ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 110f0693c8bSSteven Rostedt __entry->success, __entry->cpu) 111ad8d75ffSSteven Rostedt ); 112ad8d75ffSSteven Rostedt 113ad8d75ffSSteven Rostedt /* 114ad8d75ffSSteven Rostedt * Tracepoint for waking up a new task: 115ad8d75ffSSteven Rostedt * 116ad8d75ffSSteven Rostedt * (NOTE: the 'rq' argument is not used by generic trace events, 117ad8d75ffSSteven Rostedt * but used by the latency tracer plugin. ) 118ad8d75ffSSteven Rostedt */ 119ad8d75ffSSteven Rostedt TRACE_EVENT(sched_wakeup_new, 120ad8d75ffSSteven Rostedt 121ad8d75ffSSteven Rostedt TP_PROTO(struct rq *rq, struct task_struct *p, int success), 122ad8d75ffSSteven Rostedt 123ad8d75ffSSteven Rostedt TP_ARGS(rq, p, success), 124ad8d75ffSSteven Rostedt 125ad8d75ffSSteven Rostedt TP_STRUCT__entry( 126ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 127ad8d75ffSSteven Rostedt __field( pid_t, pid ) 128ad8d75ffSSteven Rostedt __field( int, prio ) 129ad8d75ffSSteven Rostedt __field( int, success ) 130f0693c8bSSteven Rostedt __field( int, cpu ) 131ad8d75ffSSteven Rostedt ), 132ad8d75ffSSteven Rostedt 133ad8d75ffSSteven Rostedt TP_fast_assign( 134ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 135ad8d75ffSSteven Rostedt __entry->pid = p->pid; 136ad8d75ffSSteven Rostedt __entry->prio = p->prio; 137ad8d75ffSSteven Rostedt __entry->success = success; 138f0693c8bSSteven Rostedt __entry->cpu = task_cpu(p); 139ad8d75ffSSteven Rostedt ), 140ad8d75ffSSteven Rostedt 141f0693c8bSSteven Rostedt TP_printk("task %s:%d [%d] success=%d [%03d]", 142ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 143f0693c8bSSteven Rostedt __entry->success, __entry->cpu) 144ad8d75ffSSteven Rostedt ); 145ad8d75ffSSteven Rostedt 146ad8d75ffSSteven Rostedt /* 147ad8d75ffSSteven Rostedt * Tracepoint for task switches, performed by the scheduler: 148ad8d75ffSSteven Rostedt * 149ad8d75ffSSteven Rostedt * (NOTE: the 'rq' argument is not used by generic trace events, 150ad8d75ffSSteven Rostedt * but used by the latency tracer plugin. ) 151ad8d75ffSSteven Rostedt */ 152ad8d75ffSSteven Rostedt TRACE_EVENT(sched_switch, 153ad8d75ffSSteven Rostedt 154ad8d75ffSSteven Rostedt TP_PROTO(struct rq *rq, struct task_struct *prev, 155ad8d75ffSSteven Rostedt struct task_struct *next), 156ad8d75ffSSteven Rostedt 157ad8d75ffSSteven Rostedt TP_ARGS(rq, prev, next), 158ad8d75ffSSteven Rostedt 159ad8d75ffSSteven Rostedt TP_STRUCT__entry( 160ad8d75ffSSteven Rostedt __array( char, prev_comm, TASK_COMM_LEN ) 161ad8d75ffSSteven Rostedt __field( pid_t, prev_pid ) 162ad8d75ffSSteven Rostedt __field( int, prev_prio ) 163937cdb9dSSteven Rostedt __field( long, prev_state ) 164ad8d75ffSSteven Rostedt __array( char, next_comm, TASK_COMM_LEN ) 165ad8d75ffSSteven Rostedt __field( pid_t, next_pid ) 166ad8d75ffSSteven Rostedt __field( int, next_prio ) 167ad8d75ffSSteven Rostedt ), 168ad8d75ffSSteven Rostedt 169ad8d75ffSSteven Rostedt TP_fast_assign( 170ad8d75ffSSteven Rostedt memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); 171ad8d75ffSSteven Rostedt __entry->prev_pid = prev->pid; 172ad8d75ffSSteven Rostedt __entry->prev_prio = prev->prio; 173937cdb9dSSteven Rostedt __entry->prev_state = prev->state; 174ad8d75ffSSteven Rostedt memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); 175ad8d75ffSSteven Rostedt __entry->next_pid = next->pid; 176ad8d75ffSSteven Rostedt __entry->next_prio = next->prio; 177ad8d75ffSSteven Rostedt ), 178ad8d75ffSSteven Rostedt 179937cdb9dSSteven Rostedt TP_printk("task %s:%d [%d] (%s) ==> %s:%d [%d]", 180ad8d75ffSSteven Rostedt __entry->prev_comm, __entry->prev_pid, __entry->prev_prio, 181937cdb9dSSteven Rostedt __entry->prev_state ? 182937cdb9dSSteven Rostedt __print_flags(__entry->prev_state, "|", 183937cdb9dSSteven Rostedt { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" }, 184937cdb9dSSteven Rostedt { 16, "Z" }, { 32, "X" }, { 64, "x" }, 185937cdb9dSSteven Rostedt { 128, "W" }) : "R", 186ad8d75ffSSteven Rostedt __entry->next_comm, __entry->next_pid, __entry->next_prio) 187ad8d75ffSSteven Rostedt ); 188ad8d75ffSSteven Rostedt 189ad8d75ffSSteven Rostedt /* 190ad8d75ffSSteven Rostedt * Tracepoint for a task being migrated: 191ad8d75ffSSteven Rostedt */ 192ad8d75ffSSteven Rostedt TRACE_EVENT(sched_migrate_task, 193ad8d75ffSSteven Rostedt 194de1d7286SMathieu Desnoyers TP_PROTO(struct task_struct *p, int dest_cpu), 195ad8d75ffSSteven Rostedt 196de1d7286SMathieu Desnoyers TP_ARGS(p, dest_cpu), 197ad8d75ffSSteven Rostedt 198ad8d75ffSSteven Rostedt TP_STRUCT__entry( 199ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 200ad8d75ffSSteven Rostedt __field( pid_t, pid ) 201ad8d75ffSSteven Rostedt __field( int, prio ) 202ad8d75ffSSteven Rostedt __field( int, orig_cpu ) 203ad8d75ffSSteven Rostedt __field( int, dest_cpu ) 204ad8d75ffSSteven Rostedt ), 205ad8d75ffSSteven Rostedt 206ad8d75ffSSteven Rostedt TP_fast_assign( 207ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 208ad8d75ffSSteven Rostedt __entry->pid = p->pid; 209ad8d75ffSSteven Rostedt __entry->prio = p->prio; 210de1d7286SMathieu Desnoyers __entry->orig_cpu = task_cpu(p); 211ad8d75ffSSteven Rostedt __entry->dest_cpu = dest_cpu; 212ad8d75ffSSteven Rostedt ), 213ad8d75ffSSteven Rostedt 214ad8d75ffSSteven Rostedt TP_printk("task %s:%d [%d] from: %d to: %d", 215ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 216ad8d75ffSSteven Rostedt __entry->orig_cpu, __entry->dest_cpu) 217ad8d75ffSSteven Rostedt ); 218ad8d75ffSSteven Rostedt 219ad8d75ffSSteven Rostedt /* 220ad8d75ffSSteven Rostedt * Tracepoint for freeing a task: 221ad8d75ffSSteven Rostedt */ 222ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_free, 223ad8d75ffSSteven Rostedt 224ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 225ad8d75ffSSteven Rostedt 226ad8d75ffSSteven Rostedt TP_ARGS(p), 227ad8d75ffSSteven Rostedt 228ad8d75ffSSteven Rostedt TP_STRUCT__entry( 229ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 230ad8d75ffSSteven Rostedt __field( pid_t, pid ) 231ad8d75ffSSteven Rostedt __field( int, prio ) 232ad8d75ffSSteven Rostedt ), 233ad8d75ffSSteven Rostedt 234ad8d75ffSSteven Rostedt TP_fast_assign( 235ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 236ad8d75ffSSteven Rostedt __entry->pid = p->pid; 237ad8d75ffSSteven Rostedt __entry->prio = p->prio; 238ad8d75ffSSteven Rostedt ), 239ad8d75ffSSteven Rostedt 240ad8d75ffSSteven Rostedt TP_printk("task %s:%d [%d]", 241ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 242ad8d75ffSSteven Rostedt ); 243ad8d75ffSSteven Rostedt 244ad8d75ffSSteven Rostedt /* 245ad8d75ffSSteven Rostedt * Tracepoint for a task exiting: 246ad8d75ffSSteven Rostedt */ 247ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_exit, 248ad8d75ffSSteven Rostedt 249ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 250ad8d75ffSSteven Rostedt 251ad8d75ffSSteven Rostedt TP_ARGS(p), 252ad8d75ffSSteven Rostedt 253ad8d75ffSSteven Rostedt TP_STRUCT__entry( 254ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 255ad8d75ffSSteven Rostedt __field( pid_t, pid ) 256ad8d75ffSSteven Rostedt __field( int, prio ) 257ad8d75ffSSteven Rostedt ), 258ad8d75ffSSteven Rostedt 259ad8d75ffSSteven Rostedt TP_fast_assign( 260ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 261ad8d75ffSSteven Rostedt __entry->pid = p->pid; 262ad8d75ffSSteven Rostedt __entry->prio = p->prio; 263ad8d75ffSSteven Rostedt ), 264ad8d75ffSSteven Rostedt 265ad8d75ffSSteven Rostedt TP_printk("task %s:%d [%d]", 266ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 267ad8d75ffSSteven Rostedt ); 268ad8d75ffSSteven Rostedt 269ad8d75ffSSteven Rostedt /* 270ad8d75ffSSteven Rostedt * Tracepoint for a waiting task: 271ad8d75ffSSteven Rostedt */ 272ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_wait, 273ad8d75ffSSteven Rostedt 274ad8d75ffSSteven Rostedt TP_PROTO(struct pid *pid), 275ad8d75ffSSteven Rostedt 276ad8d75ffSSteven Rostedt TP_ARGS(pid), 277ad8d75ffSSteven Rostedt 278ad8d75ffSSteven Rostedt TP_STRUCT__entry( 279ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 280ad8d75ffSSteven Rostedt __field( pid_t, pid ) 281ad8d75ffSSteven Rostedt __field( int, prio ) 282ad8d75ffSSteven Rostedt ), 283ad8d75ffSSteven Rostedt 284ad8d75ffSSteven Rostedt TP_fast_assign( 285ad8d75ffSSteven Rostedt memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 286ad8d75ffSSteven Rostedt __entry->pid = pid_nr(pid); 287ad8d75ffSSteven Rostedt __entry->prio = current->prio; 288ad8d75ffSSteven Rostedt ), 289ad8d75ffSSteven Rostedt 290ad8d75ffSSteven Rostedt TP_printk("task %s:%d [%d]", 291ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 292ad8d75ffSSteven Rostedt ); 293ad8d75ffSSteven Rostedt 294ad8d75ffSSteven Rostedt /* 295ad8d75ffSSteven Rostedt * Tracepoint for do_fork: 296ad8d75ffSSteven Rostedt */ 297ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_fork, 298ad8d75ffSSteven Rostedt 299ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *parent, struct task_struct *child), 300ad8d75ffSSteven Rostedt 301ad8d75ffSSteven Rostedt TP_ARGS(parent, child), 302ad8d75ffSSteven Rostedt 303ad8d75ffSSteven Rostedt TP_STRUCT__entry( 304ad8d75ffSSteven Rostedt __array( char, parent_comm, TASK_COMM_LEN ) 305ad8d75ffSSteven Rostedt __field( pid_t, parent_pid ) 306ad8d75ffSSteven Rostedt __array( char, child_comm, TASK_COMM_LEN ) 307ad8d75ffSSteven Rostedt __field( pid_t, child_pid ) 308ad8d75ffSSteven Rostedt ), 309ad8d75ffSSteven Rostedt 310ad8d75ffSSteven Rostedt TP_fast_assign( 311ad8d75ffSSteven Rostedt memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN); 312ad8d75ffSSteven Rostedt __entry->parent_pid = parent->pid; 313ad8d75ffSSteven Rostedt memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN); 314ad8d75ffSSteven Rostedt __entry->child_pid = child->pid; 315ad8d75ffSSteven Rostedt ), 316ad8d75ffSSteven Rostedt 317ad8d75ffSSteven Rostedt TP_printk("parent %s:%d child %s:%d", 318ad8d75ffSSteven Rostedt __entry->parent_comm, __entry->parent_pid, 319ad8d75ffSSteven Rostedt __entry->child_comm, __entry->child_pid) 320ad8d75ffSSteven Rostedt ); 321ad8d75ffSSteven Rostedt 322ad8d75ffSSteven Rostedt /* 323ad8d75ffSSteven Rostedt * Tracepoint for sending a signal: 324ad8d75ffSSteven Rostedt */ 325ad8d75ffSSteven Rostedt TRACE_EVENT(sched_signal_send, 326ad8d75ffSSteven Rostedt 327ad8d75ffSSteven Rostedt TP_PROTO(int sig, struct task_struct *p), 328ad8d75ffSSteven Rostedt 329ad8d75ffSSteven Rostedt TP_ARGS(sig, p), 330ad8d75ffSSteven Rostedt 331ad8d75ffSSteven Rostedt TP_STRUCT__entry( 332ad8d75ffSSteven Rostedt __field( int, sig ) 333ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 334ad8d75ffSSteven Rostedt __field( pid_t, pid ) 335ad8d75ffSSteven Rostedt ), 336ad8d75ffSSteven Rostedt 337ad8d75ffSSteven Rostedt TP_fast_assign( 338ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 339ad8d75ffSSteven Rostedt __entry->pid = p->pid; 340ad8d75ffSSteven Rostedt __entry->sig = sig; 341ad8d75ffSSteven Rostedt ), 342ad8d75ffSSteven Rostedt 343ad8d75ffSSteven Rostedt TP_printk("sig: %d task %s:%d", 344ad8d75ffSSteven Rostedt __entry->sig, __entry->comm, __entry->pid) 345ad8d75ffSSteven Rostedt ); 346ad8d75ffSSteven Rostedt 347768d0c27SPeter Zijlstra /* 348768d0c27SPeter Zijlstra * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE 349768d0c27SPeter Zijlstra * adding sched_stat support to SCHED_FIFO/RR would be welcome. 350768d0c27SPeter Zijlstra */ 351768d0c27SPeter Zijlstra 352768d0c27SPeter Zijlstra /* 353768d0c27SPeter Zijlstra * Tracepoint for accounting wait time (time the task is runnable 354768d0c27SPeter Zijlstra * but not actually running due to scheduler contention). 355768d0c27SPeter Zijlstra */ 356768d0c27SPeter Zijlstra TRACE_EVENT(sched_stat_wait, 357768d0c27SPeter Zijlstra 358768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 359768d0c27SPeter Zijlstra 360768d0c27SPeter Zijlstra TP_ARGS(tsk, delay), 361768d0c27SPeter Zijlstra 362768d0c27SPeter Zijlstra TP_STRUCT__entry( 363768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 364768d0c27SPeter Zijlstra __field( pid_t, pid ) 365768d0c27SPeter Zijlstra __field( u64, delay ) 366768d0c27SPeter Zijlstra ), 367768d0c27SPeter Zijlstra 368768d0c27SPeter Zijlstra TP_fast_assign( 369768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 370768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 371768d0c27SPeter Zijlstra __entry->delay = delay; 372768d0c27SPeter Zijlstra ) 373768d0c27SPeter Zijlstra TP_perf_assign( 374768d0c27SPeter Zijlstra __perf_count(delay); 375768d0c27SPeter Zijlstra ), 376768d0c27SPeter Zijlstra 377768d0c27SPeter Zijlstra TP_printk("task: %s:%d wait: %Lu [ns]", 378768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 379768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 380768d0c27SPeter Zijlstra ); 381768d0c27SPeter Zijlstra 382768d0c27SPeter Zijlstra /* 383f977bb49SIngo Molnar * Tracepoint for accounting runtime (time the task is executing 384f977bb49SIngo Molnar * on a CPU). 385f977bb49SIngo Molnar */ 386f977bb49SIngo Molnar TRACE_EVENT(sched_stat_runtime, 387f977bb49SIngo Molnar 388f977bb49SIngo Molnar TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 389f977bb49SIngo Molnar 390f977bb49SIngo Molnar TP_ARGS(tsk, runtime, vruntime), 391f977bb49SIngo Molnar 392f977bb49SIngo Molnar TP_STRUCT__entry( 393f977bb49SIngo Molnar __array( char, comm, TASK_COMM_LEN ) 394f977bb49SIngo Molnar __field( pid_t, pid ) 395f977bb49SIngo Molnar __field( u64, runtime ) 396f977bb49SIngo Molnar __field( u64, vruntime ) 397f977bb49SIngo Molnar ), 398f977bb49SIngo Molnar 399f977bb49SIngo Molnar TP_fast_assign( 400f977bb49SIngo Molnar memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 401f977bb49SIngo Molnar __entry->pid = tsk->pid; 402f977bb49SIngo Molnar __entry->runtime = runtime; 403f977bb49SIngo Molnar __entry->vruntime = vruntime; 404f977bb49SIngo Molnar ) 405f977bb49SIngo Molnar TP_perf_assign( 406f977bb49SIngo Molnar __perf_count(runtime); 407f977bb49SIngo Molnar ), 408f977bb49SIngo Molnar 409f977bb49SIngo Molnar TP_printk("task: %s:%d runtime: %Lu [ns], vruntime: %Lu [ns]", 410f977bb49SIngo Molnar __entry->comm, __entry->pid, 411f977bb49SIngo Molnar (unsigned long long)__entry->runtime, 412f977bb49SIngo Molnar (unsigned long long)__entry->vruntime) 413f977bb49SIngo Molnar ); 414f977bb49SIngo Molnar 415f977bb49SIngo Molnar /* 416768d0c27SPeter Zijlstra * Tracepoint for accounting sleep time (time the task is not runnable, 417768d0c27SPeter Zijlstra * including iowait, see below). 418768d0c27SPeter Zijlstra */ 419768d0c27SPeter Zijlstra TRACE_EVENT(sched_stat_sleep, 420768d0c27SPeter Zijlstra 421768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 422768d0c27SPeter Zijlstra 423768d0c27SPeter Zijlstra TP_ARGS(tsk, delay), 424768d0c27SPeter Zijlstra 425768d0c27SPeter Zijlstra TP_STRUCT__entry( 426768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 427768d0c27SPeter Zijlstra __field( pid_t, pid ) 428768d0c27SPeter Zijlstra __field( u64, delay ) 429768d0c27SPeter Zijlstra ), 430768d0c27SPeter Zijlstra 431768d0c27SPeter Zijlstra TP_fast_assign( 432768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 433768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 434768d0c27SPeter Zijlstra __entry->delay = delay; 435768d0c27SPeter Zijlstra ) 436768d0c27SPeter Zijlstra TP_perf_assign( 437768d0c27SPeter Zijlstra __perf_count(delay); 438768d0c27SPeter Zijlstra ), 439768d0c27SPeter Zijlstra 440768d0c27SPeter Zijlstra TP_printk("task: %s:%d sleep: %Lu [ns]", 441768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 442768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 443768d0c27SPeter Zijlstra ); 444768d0c27SPeter Zijlstra 445768d0c27SPeter Zijlstra /* 446768d0c27SPeter Zijlstra * Tracepoint for accounting iowait time (time the task is not runnable 447768d0c27SPeter Zijlstra * due to waiting on IO to complete). 448768d0c27SPeter Zijlstra */ 449768d0c27SPeter Zijlstra TRACE_EVENT(sched_stat_iowait, 450768d0c27SPeter Zijlstra 451768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 452768d0c27SPeter Zijlstra 453768d0c27SPeter Zijlstra TP_ARGS(tsk, delay), 454768d0c27SPeter Zijlstra 455768d0c27SPeter Zijlstra TP_STRUCT__entry( 456768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 457768d0c27SPeter Zijlstra __field( pid_t, pid ) 458768d0c27SPeter Zijlstra __field( u64, delay ) 459768d0c27SPeter Zijlstra ), 460768d0c27SPeter Zijlstra 461768d0c27SPeter Zijlstra TP_fast_assign( 462768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 463768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 464768d0c27SPeter Zijlstra __entry->delay = delay; 465768d0c27SPeter Zijlstra ) 466768d0c27SPeter Zijlstra TP_perf_assign( 467768d0c27SPeter Zijlstra __perf_count(delay); 468768d0c27SPeter Zijlstra ), 469768d0c27SPeter Zijlstra 470768d0c27SPeter Zijlstra TP_printk("task: %s:%d iowait: %Lu [ns]", 471768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 472768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 473768d0c27SPeter Zijlstra ); 474768d0c27SPeter Zijlstra 475ad8d75ffSSteven Rostedt #endif /* _TRACE_SCHED_H */ 476ad8d75ffSSteven Rostedt 477ad8d75ffSSteven Rostedt /* This part must be outside protection */ 478ad8d75ffSSteven Rostedt #include <trace/define_trace.h> 479