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 347ad8d75ffSSteven Rostedt #endif /* _TRACE_SCHED_H */ 348ad8d75ffSSteven Rostedt 349ad8d75ffSSteven Rostedt /* This part must be outside protection */ 350ad8d75ffSSteven Rostedt #include <trace/define_trace.h> 351