1d0b6e04aSLi Zefan #undef TRACE_SYSTEM 2d0b6e04aSLi Zefan #define TRACE_SYSTEM sched 3d0b6e04aSLi Zefan 4ea20d929SSteven Rostedt #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ) 50a16b607SMathieu Desnoyers #define _TRACE_SCHED_H 60a16b607SMathieu Desnoyers 76a3827d7SIngo Molnar #include <linux/sched/numa_balancing.h> 80a16b607SMathieu Desnoyers #include <linux/tracepoint.h> 94ff16c25SDavid Smith #include <linux/binfmts.h> 100a16b607SMathieu Desnoyers 11ea20d929SSteven Rostedt /* 12ea20d929SSteven Rostedt * Tracepoint for calling kthread_stop, performed to end a kthread: 13ea20d929SSteven Rostedt */ 14ea20d929SSteven Rostedt TRACE_EVENT(sched_kthread_stop, 15ea20d929SSteven Rostedt 16ea20d929SSteven Rostedt TP_PROTO(struct task_struct *t), 17ea20d929SSteven Rostedt 18ea20d929SSteven Rostedt TP_ARGS(t), 19ea20d929SSteven Rostedt 20ea20d929SSteven Rostedt TP_STRUCT__entry( 21ea20d929SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 22ea20d929SSteven Rostedt __field( pid_t, pid ) 23ea20d929SSteven Rostedt ), 24ea20d929SSteven Rostedt 25ea20d929SSteven Rostedt TP_fast_assign( 26ea20d929SSteven Rostedt memcpy(__entry->comm, t->comm, TASK_COMM_LEN); 27ea20d929SSteven Rostedt __entry->pid = t->pid; 28ea20d929SSteven Rostedt ), 29ea20d929SSteven Rostedt 30434a83c3SIngo Molnar TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) 31ea20d929SSteven Rostedt ); 32ea20d929SSteven Rostedt 33ea20d929SSteven Rostedt /* 34ea20d929SSteven Rostedt * Tracepoint for the return value of the kthread stopping: 35ea20d929SSteven Rostedt */ 36ea20d929SSteven Rostedt TRACE_EVENT(sched_kthread_stop_ret, 37ea20d929SSteven Rostedt 38ea20d929SSteven Rostedt TP_PROTO(int ret), 39ea20d929SSteven Rostedt 40ea20d929SSteven Rostedt TP_ARGS(ret), 41ea20d929SSteven Rostedt 42ea20d929SSteven Rostedt TP_STRUCT__entry( 43ea20d929SSteven Rostedt __field( int, ret ) 44ea20d929SSteven Rostedt ), 45ea20d929SSteven Rostedt 46ea20d929SSteven Rostedt TP_fast_assign( 47ea20d929SSteven Rostedt __entry->ret = ret; 48ea20d929SSteven Rostedt ), 49ea20d929SSteven Rostedt 50434a83c3SIngo Molnar TP_printk("ret=%d", __entry->ret) 51ea20d929SSteven Rostedt ); 52ea20d929SSteven Rostedt 53ea20d929SSteven Rostedt /* 54ea20d929SSteven Rostedt * Tracepoint for waking up a task: 55ea20d929SSteven Rostedt */ 56091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_wakeup_template, 57ea20d929SSteven Rostedt 58fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 59ea20d929SSteven Rostedt 60fbd705a0SPeter Zijlstra TP_ARGS(__perf_task(p)), 61ea20d929SSteven Rostedt 62ea20d929SSteven Rostedt TP_STRUCT__entry( 63ea20d929SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 64ea20d929SSteven Rostedt __field( pid_t, pid ) 65ea20d929SSteven Rostedt __field( int, prio ) 66ea20d929SSteven Rostedt __field( int, success ) 67434a83c3SIngo Molnar __field( int, target_cpu ) 68ea20d929SSteven Rostedt ), 69ea20d929SSteven Rostedt 70ea20d929SSteven Rostedt TP_fast_assign( 71ea20d929SSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 72ea20d929SSteven Rostedt __entry->pid = p->pid; 73b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 74fbd705a0SPeter Zijlstra __entry->success = 1; /* rudiment, kill when possible */ 75434a83c3SIngo Molnar __entry->target_cpu = task_cpu(p); 76ea20d929SSteven Rostedt ), 77ea20d929SSteven Rostedt 78fbd705a0SPeter Zijlstra TP_printk("comm=%s pid=%d prio=%d target_cpu=%03d", 79ea20d929SSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 80fbd705a0SPeter Zijlstra __entry->target_cpu) 81ea20d929SSteven Rostedt ); 82ea20d929SSteven Rostedt 83fbd705a0SPeter Zijlstra /* 84fbd705a0SPeter Zijlstra * Tracepoint called when waking a task; this tracepoint is guaranteed to be 85fbd705a0SPeter Zijlstra * called from the waking context. 86fbd705a0SPeter Zijlstra */ 87fbd705a0SPeter Zijlstra DEFINE_EVENT(sched_wakeup_template, sched_waking, 88fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 89fbd705a0SPeter Zijlstra TP_ARGS(p)); 90fbd705a0SPeter Zijlstra 91fbd705a0SPeter Zijlstra /* 92fbd705a0SPeter Zijlstra * Tracepoint called when the task is actually woken; p->state == TASK_RUNNNG. 93fbd705a0SPeter Zijlstra * It it not always called from the waking context. 94fbd705a0SPeter Zijlstra */ 9575ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup, 96fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 97fbd705a0SPeter Zijlstra TP_ARGS(p)); 9875ec29abSSteven Rostedt 99ea20d929SSteven Rostedt /* 100ea20d929SSteven Rostedt * Tracepoint for waking up a new task: 101ea20d929SSteven Rostedt */ 10275ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new, 103fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 104fbd705a0SPeter Zijlstra TP_ARGS(p)); 105ea20d929SSteven Rostedt 10602f72694SPeter Zijlstra #ifdef CREATE_TRACE_POINTS 107c73464b1SPeter Zijlstra static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p) 10802f72694SPeter Zijlstra { 1098f9fbf09SOleg Nesterov #ifdef CONFIG_SCHED_DEBUG 1108f9fbf09SOleg Nesterov BUG_ON(p != current); 1118f9fbf09SOleg Nesterov #endif /* CONFIG_SCHED_DEBUG */ 11202f72694SPeter Zijlstra 113c73464b1SPeter Zijlstra /* 114c73464b1SPeter Zijlstra * Preemption ignores task state, therefore preempted tasks are always 115c73464b1SPeter Zijlstra * RUNNING (we will not have dequeued if state != RUNNING). 116c73464b1SPeter Zijlstra */ 117*efb40f58SPeter Zijlstra if (preempt) 118*efb40f58SPeter Zijlstra return TASK_STATE_MAX; 119*efb40f58SPeter Zijlstra 120*efb40f58SPeter Zijlstra return __get_task_state(p); 12102f72694SPeter Zijlstra } 1228f9fbf09SOleg Nesterov #endif /* CREATE_TRACE_POINTS */ 12302f72694SPeter Zijlstra 124ea20d929SSteven Rostedt /* 125ea20d929SSteven Rostedt * Tracepoint for task switches, performed by the scheduler: 126ea20d929SSteven Rostedt */ 127ea20d929SSteven Rostedt TRACE_EVENT(sched_switch, 128ea20d929SSteven Rostedt 129c73464b1SPeter Zijlstra TP_PROTO(bool preempt, 130c73464b1SPeter Zijlstra struct task_struct *prev, 131ea20d929SSteven Rostedt struct task_struct *next), 132ea20d929SSteven Rostedt 133c73464b1SPeter Zijlstra TP_ARGS(preempt, prev, next), 134ea20d929SSteven Rostedt 135ea20d929SSteven Rostedt TP_STRUCT__entry( 136ea20d929SSteven Rostedt __array( char, prev_comm, TASK_COMM_LEN ) 137ea20d929SSteven Rostedt __field( pid_t, prev_pid ) 138ea20d929SSteven Rostedt __field( int, prev_prio ) 139937cdb9dSSteven Rostedt __field( long, prev_state ) 140ea20d929SSteven Rostedt __array( char, next_comm, TASK_COMM_LEN ) 141ea20d929SSteven Rostedt __field( pid_t, next_pid ) 142ea20d929SSteven Rostedt __field( int, next_prio ) 143ea20d929SSteven Rostedt ), 144ea20d929SSteven Rostedt 145ea20d929SSteven Rostedt TP_fast_assign( 146ea20d929SSteven Rostedt memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); 147ea20d929SSteven Rostedt __entry->prev_pid = prev->pid; 148ea20d929SSteven Rostedt __entry->prev_prio = prev->prio; 149c73464b1SPeter Zijlstra __entry->prev_state = __trace_sched_switch_state(preempt, prev); 150ea20d929SSteven Rostedt memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); 151ea20d929SSteven Rostedt __entry->next_pid = next->pid; 152ea20d929SSteven Rostedt __entry->next_prio = next->prio; 153b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE */ 154ea20d929SSteven Rostedt ), 155ea20d929SSteven Rostedt 156557ab425SPeter Zijlstra TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d", 157ea20d929SSteven Rostedt __entry->prev_comm, __entry->prev_pid, __entry->prev_prio, 158*efb40f58SPeter Zijlstra 159*efb40f58SPeter Zijlstra (__entry->prev_state & TASK_REPORT) ? 160*efb40f58SPeter Zijlstra __print_flags(__entry->prev_state & TASK_REPORT, "|", 161*efb40f58SPeter Zijlstra { 0x01, "S" }, { 0x02, "D" }, { 0x04, "T" }, 162*efb40f58SPeter Zijlstra { 0x08, "t" }, { 0x10, "X" }, { 0x20, "Z" }) : 163*efb40f58SPeter Zijlstra "R", 164*efb40f58SPeter Zijlstra 165557ab425SPeter Zijlstra __entry->prev_state & TASK_STATE_MAX ? "+" : "", 166ea20d929SSteven Rostedt __entry->next_comm, __entry->next_pid, __entry->next_prio) 167ea20d929SSteven Rostedt ); 168ea20d929SSteven Rostedt 169ea20d929SSteven Rostedt /* 170ea20d929SSteven Rostedt * Tracepoint for a task being migrated: 171ea20d929SSteven Rostedt */ 172ea20d929SSteven Rostedt TRACE_EVENT(sched_migrate_task, 173ea20d929SSteven Rostedt 174de1d7286SMathieu Desnoyers TP_PROTO(struct task_struct *p, int dest_cpu), 175ea20d929SSteven Rostedt 176de1d7286SMathieu Desnoyers TP_ARGS(p, dest_cpu), 177ea20d929SSteven Rostedt 178ea20d929SSteven Rostedt TP_STRUCT__entry( 179ea20d929SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 180ea20d929SSteven Rostedt __field( pid_t, pid ) 181ea20d929SSteven Rostedt __field( int, prio ) 182ea20d929SSteven Rostedt __field( int, orig_cpu ) 183ea20d929SSteven Rostedt __field( int, dest_cpu ) 184ea20d929SSteven Rostedt ), 185ea20d929SSteven Rostedt 186ea20d929SSteven Rostedt TP_fast_assign( 187ea20d929SSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 188ea20d929SSteven Rostedt __entry->pid = p->pid; 189b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 190de1d7286SMathieu Desnoyers __entry->orig_cpu = task_cpu(p); 191ea20d929SSteven Rostedt __entry->dest_cpu = dest_cpu; 192ea20d929SSteven Rostedt ), 193ea20d929SSteven Rostedt 194434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d", 195ea20d929SSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 196ea20d929SSteven Rostedt __entry->orig_cpu, __entry->dest_cpu) 197ea20d929SSteven Rostedt ); 198ea20d929SSteven Rostedt 199091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_process_template, 200ea20d929SSteven Rostedt 201ea20d929SSteven Rostedt TP_PROTO(struct task_struct *p), 202ea20d929SSteven Rostedt 203ea20d929SSteven Rostedt TP_ARGS(p), 204ea20d929SSteven Rostedt 205ea20d929SSteven Rostedt TP_STRUCT__entry( 206ea20d929SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 207ea20d929SSteven Rostedt __field( pid_t, pid ) 208ea20d929SSteven Rostedt __field( int, prio ) 209ea20d929SSteven Rostedt ), 210ea20d929SSteven Rostedt 211ea20d929SSteven Rostedt TP_fast_assign( 212ea20d929SSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 213ea20d929SSteven Rostedt __entry->pid = p->pid; 214b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 215ea20d929SSteven Rostedt ), 216ea20d929SSteven Rostedt 217434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 218ea20d929SSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 219ea20d929SSteven Rostedt ); 220ea20d929SSteven Rostedt 221ea20d929SSteven Rostedt /* 22275ec29abSSteven Rostedt * Tracepoint for freeing a task: 22375ec29abSSteven Rostedt */ 22475ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_free, 22575ec29abSSteven Rostedt TP_PROTO(struct task_struct *p), 22675ec29abSSteven Rostedt TP_ARGS(p)); 22775ec29abSSteven Rostedt 22875ec29abSSteven Rostedt 22975ec29abSSteven Rostedt /* 230ea20d929SSteven Rostedt * Tracepoint for a task exiting: 231ea20d929SSteven Rostedt */ 23275ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_exit, 233ea20d929SSteven Rostedt TP_PROTO(struct task_struct *p), 23475ec29abSSteven Rostedt TP_ARGS(p)); 235ea20d929SSteven Rostedt 236ea20d929SSteven Rostedt /* 237210f7669SLi Zefan * Tracepoint for waiting on task to unschedule: 238210f7669SLi Zefan */ 239210f7669SLi Zefan DEFINE_EVENT(sched_process_template, sched_wait_task, 240210f7669SLi Zefan TP_PROTO(struct task_struct *p), 241210f7669SLi Zefan TP_ARGS(p)); 242210f7669SLi Zefan 243210f7669SLi Zefan /* 244ea20d929SSteven Rostedt * Tracepoint for a waiting task: 245ea20d929SSteven Rostedt */ 246ea20d929SSteven Rostedt TRACE_EVENT(sched_process_wait, 247ea20d929SSteven Rostedt 248ea20d929SSteven Rostedt TP_PROTO(struct pid *pid), 249ea20d929SSteven Rostedt 250ea20d929SSteven Rostedt TP_ARGS(pid), 251ea20d929SSteven Rostedt 252ea20d929SSteven Rostedt TP_STRUCT__entry( 253ea20d929SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 254ea20d929SSteven Rostedt __field( pid_t, pid ) 255ea20d929SSteven Rostedt __field( int, prio ) 256ea20d929SSteven Rostedt ), 257ea20d929SSteven Rostedt 258ea20d929SSteven Rostedt TP_fast_assign( 259ea20d929SSteven Rostedt memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 260ea20d929SSteven Rostedt __entry->pid = pid_nr(pid); 261b91473ffSPeter Zijlstra __entry->prio = current->prio; /* XXX SCHED_DEADLINE */ 262ea20d929SSteven Rostedt ), 263ea20d929SSteven Rostedt 264434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 265ea20d929SSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 266ea20d929SSteven Rostedt ); 267ea20d929SSteven Rostedt 268ea20d929SSteven Rostedt /* 269ea20d929SSteven Rostedt * Tracepoint for do_fork: 270ea20d929SSteven Rostedt */ 271ea20d929SSteven Rostedt TRACE_EVENT(sched_process_fork, 272ea20d929SSteven Rostedt 273ea20d929SSteven Rostedt TP_PROTO(struct task_struct *parent, struct task_struct *child), 274ea20d929SSteven Rostedt 275ea20d929SSteven Rostedt TP_ARGS(parent, child), 276ea20d929SSteven Rostedt 277ea20d929SSteven Rostedt TP_STRUCT__entry( 278ea20d929SSteven Rostedt __array( char, parent_comm, TASK_COMM_LEN ) 279ea20d929SSteven Rostedt __field( pid_t, parent_pid ) 280ea20d929SSteven Rostedt __array( char, child_comm, TASK_COMM_LEN ) 281ea20d929SSteven Rostedt __field( pid_t, child_pid ) 282ea20d929SSteven Rostedt ), 283ea20d929SSteven Rostedt 284ea20d929SSteven Rostedt TP_fast_assign( 285ea20d929SSteven Rostedt memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN); 286ea20d929SSteven Rostedt __entry->parent_pid = parent->pid; 287ea20d929SSteven Rostedt memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN); 288ea20d929SSteven Rostedt __entry->child_pid = child->pid; 289ea20d929SSteven Rostedt ), 290ea20d929SSteven Rostedt 291434a83c3SIngo Molnar TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d", 292ea20d929SSteven Rostedt __entry->parent_comm, __entry->parent_pid, 293ea20d929SSteven Rostedt __entry->child_comm, __entry->child_pid) 294ea20d929SSteven Rostedt ); 295ea20d929SSteven Rostedt 296ea20d929SSteven Rostedt /* 2974ff16c25SDavid Smith * Tracepoint for exec: 2984ff16c25SDavid Smith */ 2994ff16c25SDavid Smith TRACE_EVENT(sched_process_exec, 3004ff16c25SDavid Smith 3014ff16c25SDavid Smith TP_PROTO(struct task_struct *p, pid_t old_pid, 3024ff16c25SDavid Smith struct linux_binprm *bprm), 3034ff16c25SDavid Smith 3044ff16c25SDavid Smith TP_ARGS(p, old_pid, bprm), 3054ff16c25SDavid Smith 3064ff16c25SDavid Smith TP_STRUCT__entry( 3074ff16c25SDavid Smith __string( filename, bprm->filename ) 3084ff16c25SDavid Smith __field( pid_t, pid ) 3094ff16c25SDavid Smith __field( pid_t, old_pid ) 3104ff16c25SDavid Smith ), 3114ff16c25SDavid Smith 3124ff16c25SDavid Smith TP_fast_assign( 3134ff16c25SDavid Smith __assign_str(filename, bprm->filename); 3144ff16c25SDavid Smith __entry->pid = p->pid; 3156308191fSOleg Nesterov __entry->old_pid = old_pid; 3164ff16c25SDavid Smith ), 3174ff16c25SDavid Smith 3184ff16c25SDavid Smith TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename), 3194ff16c25SDavid Smith __entry->pid, __entry->old_pid) 3204ff16c25SDavid Smith ); 3214ff16c25SDavid Smith 3224ff16c25SDavid Smith /* 323768d0c27SPeter Zijlstra * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE 324768d0c27SPeter Zijlstra * adding sched_stat support to SCHED_FIFO/RR would be welcome. 325768d0c27SPeter Zijlstra */ 326091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_stat_template, 327768d0c27SPeter Zijlstra 328768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 329768d0c27SPeter Zijlstra 33012473965SOleg Nesterov TP_ARGS(__perf_task(tsk), __perf_count(delay)), 331768d0c27SPeter Zijlstra 332768d0c27SPeter Zijlstra TP_STRUCT__entry( 333768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 334768d0c27SPeter Zijlstra __field( pid_t, pid ) 335768d0c27SPeter Zijlstra __field( u64, delay ) 336768d0c27SPeter Zijlstra ), 337768d0c27SPeter Zijlstra 338768d0c27SPeter Zijlstra TP_fast_assign( 339768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 340768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 341768d0c27SPeter Zijlstra __entry->delay = delay; 342768d0c27SPeter Zijlstra ), 343768d0c27SPeter Zijlstra 344434a83c3SIngo Molnar TP_printk("comm=%s pid=%d delay=%Lu [ns]", 345768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 346768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 347768d0c27SPeter Zijlstra ); 348768d0c27SPeter Zijlstra 34975ec29abSSteven Rostedt 35075ec29abSSteven Rostedt /* 35175ec29abSSteven Rostedt * Tracepoint for accounting wait time (time the task is runnable 35275ec29abSSteven Rostedt * but not actually running due to scheduler contention). 35375ec29abSSteven Rostedt */ 35475ec29abSSteven Rostedt DEFINE_EVENT(sched_stat_template, sched_stat_wait, 35575ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 35675ec29abSSteven Rostedt TP_ARGS(tsk, delay)); 35775ec29abSSteven Rostedt 35875ec29abSSteven Rostedt /* 35975ec29abSSteven Rostedt * Tracepoint for accounting sleep time (time the task is not runnable, 36075ec29abSSteven Rostedt * including iowait, see below). 36175ec29abSSteven Rostedt */ 362470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_sleep, 36375ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 364470dda74SLi Zefan TP_ARGS(tsk, delay)); 36575ec29abSSteven Rostedt 36675ec29abSSteven Rostedt /* 36775ec29abSSteven Rostedt * Tracepoint for accounting iowait time (time the task is not runnable 36875ec29abSSteven Rostedt * due to waiting on IO to complete). 36975ec29abSSteven Rostedt */ 370470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_iowait, 37175ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 372470dda74SLi Zefan TP_ARGS(tsk, delay)); 37375ec29abSSteven Rostedt 374768d0c27SPeter Zijlstra /* 375b781a602SAndrew Vagin * Tracepoint for accounting blocked time (time the task is in uninterruptible). 376b781a602SAndrew Vagin */ 377b781a602SAndrew Vagin DEFINE_EVENT(sched_stat_template, sched_stat_blocked, 378b781a602SAndrew Vagin TP_PROTO(struct task_struct *tsk, u64 delay), 379b781a602SAndrew Vagin TP_ARGS(tsk, delay)); 380b781a602SAndrew Vagin 381b781a602SAndrew Vagin /* 382f977bb49SIngo Molnar * Tracepoint for accounting runtime (time the task is executing 383f977bb49SIngo Molnar * on a CPU). 384f977bb49SIngo Molnar */ 38536009d07SOleg Nesterov DECLARE_EVENT_CLASS(sched_stat_runtime, 386f977bb49SIngo Molnar 387f977bb49SIngo Molnar TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 388f977bb49SIngo Molnar 38912473965SOleg Nesterov TP_ARGS(tsk, __perf_count(runtime), vruntime), 390f977bb49SIngo Molnar 391f977bb49SIngo Molnar TP_STRUCT__entry( 392f977bb49SIngo Molnar __array( char, comm, TASK_COMM_LEN ) 393f977bb49SIngo Molnar __field( pid_t, pid ) 394f977bb49SIngo Molnar __field( u64, runtime ) 395f977bb49SIngo Molnar __field( u64, vruntime ) 396f977bb49SIngo Molnar ), 397f977bb49SIngo Molnar 398f977bb49SIngo Molnar TP_fast_assign( 399f977bb49SIngo Molnar memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 400f977bb49SIngo Molnar __entry->pid = tsk->pid; 401f977bb49SIngo Molnar __entry->runtime = runtime; 402f977bb49SIngo Molnar __entry->vruntime = vruntime; 403f977bb49SIngo Molnar ), 404f977bb49SIngo Molnar 405434a83c3SIngo Molnar TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]", 406f977bb49SIngo Molnar __entry->comm, __entry->pid, 407f977bb49SIngo Molnar (unsigned long long)__entry->runtime, 408f977bb49SIngo Molnar (unsigned long long)__entry->vruntime) 409f977bb49SIngo Molnar ); 410f977bb49SIngo Molnar 41136009d07SOleg Nesterov DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime, 41236009d07SOleg Nesterov TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 41336009d07SOleg Nesterov TP_ARGS(tsk, runtime, vruntime)); 41436009d07SOleg Nesterov 415a8027073SSteven Rostedt /* 416a8027073SSteven Rostedt * Tracepoint for showing priority inheritance modifying a tasks 417a8027073SSteven Rostedt * priority. 418a8027073SSteven Rostedt */ 419a8027073SSteven Rostedt TRACE_EVENT(sched_pi_setprio, 420a8027073SSteven Rostedt 421b91473ffSPeter Zijlstra TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task), 422a8027073SSteven Rostedt 423b91473ffSPeter Zijlstra TP_ARGS(tsk, pi_task), 424a8027073SSteven Rostedt 425a8027073SSteven Rostedt TP_STRUCT__entry( 426a8027073SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 427a8027073SSteven Rostedt __field( pid_t, pid ) 428a8027073SSteven Rostedt __field( int, oldprio ) 429a8027073SSteven Rostedt __field( int, newprio ) 430a8027073SSteven Rostedt ), 431a8027073SSteven Rostedt 432a8027073SSteven Rostedt TP_fast_assign( 433a8027073SSteven Rostedt memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 434a8027073SSteven Rostedt __entry->pid = tsk->pid; 435a8027073SSteven Rostedt __entry->oldprio = tsk->prio; 436b91473ffSPeter Zijlstra __entry->newprio = pi_task ? pi_task->prio : tsk->prio; 437b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE bits missing */ 438a8027073SSteven Rostedt ), 439a8027073SSteven Rostedt 440a8027073SSteven Rostedt TP_printk("comm=%s pid=%d oldprio=%d newprio=%d", 441a8027073SSteven Rostedt __entry->comm, __entry->pid, 442a8027073SSteven Rostedt __entry->oldprio, __entry->newprio) 443a8027073SSteven Rostedt ); 444a8027073SSteven Rostedt 4456a716c90SOleg Nesterov #ifdef CONFIG_DETECT_HUNG_TASK 4466a716c90SOleg Nesterov TRACE_EVENT(sched_process_hang, 4476a716c90SOleg Nesterov TP_PROTO(struct task_struct *tsk), 4486a716c90SOleg Nesterov TP_ARGS(tsk), 4496a716c90SOleg Nesterov 4506a716c90SOleg Nesterov TP_STRUCT__entry( 4516a716c90SOleg Nesterov __array( char, comm, TASK_COMM_LEN ) 4526a716c90SOleg Nesterov __field( pid_t, pid ) 4536a716c90SOleg Nesterov ), 4546a716c90SOleg Nesterov 4556a716c90SOleg Nesterov TP_fast_assign( 4566a716c90SOleg Nesterov memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 4576a716c90SOleg Nesterov __entry->pid = tsk->pid; 4586a716c90SOleg Nesterov ), 4596a716c90SOleg Nesterov 4606a716c90SOleg Nesterov TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) 4616a716c90SOleg Nesterov ); 4626a716c90SOleg Nesterov #endif /* CONFIG_DETECT_HUNG_TASK */ 4636a716c90SOleg Nesterov 464286549dcSMel Gorman DECLARE_EVENT_CLASS(sched_move_task_template, 465286549dcSMel Gorman 466286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 467286549dcSMel Gorman 468286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu), 469286549dcSMel Gorman 470286549dcSMel Gorman TP_STRUCT__entry( 471286549dcSMel Gorman __field( pid_t, pid ) 472286549dcSMel Gorman __field( pid_t, tgid ) 473286549dcSMel Gorman __field( pid_t, ngid ) 474286549dcSMel Gorman __field( int, src_cpu ) 475286549dcSMel Gorman __field( int, src_nid ) 476286549dcSMel Gorman __field( int, dst_cpu ) 477286549dcSMel Gorman __field( int, dst_nid ) 478286549dcSMel Gorman ), 479286549dcSMel Gorman 480286549dcSMel Gorman TP_fast_assign( 481286549dcSMel Gorman __entry->pid = task_pid_nr(tsk); 482286549dcSMel Gorman __entry->tgid = task_tgid_nr(tsk); 483286549dcSMel Gorman __entry->ngid = task_numa_group_id(tsk); 484286549dcSMel Gorman __entry->src_cpu = src_cpu; 485286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 486286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 487286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 488286549dcSMel Gorman ), 489286549dcSMel Gorman 490286549dcSMel Gorman TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d", 491286549dcSMel Gorman __entry->pid, __entry->tgid, __entry->ngid, 492286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 493286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 494286549dcSMel Gorman ); 495286549dcSMel Gorman 496286549dcSMel Gorman /* 497286549dcSMel Gorman * Tracks migration of tasks from one runqueue to another. Can be used to 498286549dcSMel Gorman * detect if automatic NUMA balancing is bouncing between nodes 499286549dcSMel Gorman */ 500286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_move_numa, 501286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 502286549dcSMel Gorman 503286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 504286549dcSMel Gorman ); 505286549dcSMel Gorman 506286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_stick_numa, 507286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 508286549dcSMel Gorman 509286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 510286549dcSMel Gorman ); 511286549dcSMel Gorman 512286549dcSMel Gorman TRACE_EVENT(sched_swap_numa, 513286549dcSMel Gorman 514286549dcSMel Gorman TP_PROTO(struct task_struct *src_tsk, int src_cpu, 515286549dcSMel Gorman struct task_struct *dst_tsk, int dst_cpu), 516286549dcSMel Gorman 517286549dcSMel Gorman TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu), 518286549dcSMel Gorman 519286549dcSMel Gorman TP_STRUCT__entry( 520286549dcSMel Gorman __field( pid_t, src_pid ) 521286549dcSMel Gorman __field( pid_t, src_tgid ) 522286549dcSMel Gorman __field( pid_t, src_ngid ) 523286549dcSMel Gorman __field( int, src_cpu ) 524286549dcSMel Gorman __field( int, src_nid ) 525286549dcSMel Gorman __field( pid_t, dst_pid ) 526286549dcSMel Gorman __field( pid_t, dst_tgid ) 527286549dcSMel Gorman __field( pid_t, dst_ngid ) 528286549dcSMel Gorman __field( int, dst_cpu ) 529286549dcSMel Gorman __field( int, dst_nid ) 530286549dcSMel Gorman ), 531286549dcSMel Gorman 532286549dcSMel Gorman TP_fast_assign( 533286549dcSMel Gorman __entry->src_pid = task_pid_nr(src_tsk); 534286549dcSMel Gorman __entry->src_tgid = task_tgid_nr(src_tsk); 535286549dcSMel Gorman __entry->src_ngid = task_numa_group_id(src_tsk); 536286549dcSMel Gorman __entry->src_cpu = src_cpu; 537286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 538286549dcSMel Gorman __entry->dst_pid = task_pid_nr(dst_tsk); 539286549dcSMel Gorman __entry->dst_tgid = task_tgid_nr(dst_tsk); 540286549dcSMel Gorman __entry->dst_ngid = task_numa_group_id(dst_tsk); 541286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 542286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 543286549dcSMel Gorman ), 544286549dcSMel Gorman 545286549dcSMel Gorman TP_printk("src_pid=%d src_tgid=%d src_ngid=%d src_cpu=%d src_nid=%d dst_pid=%d dst_tgid=%d dst_ngid=%d dst_cpu=%d dst_nid=%d", 546286549dcSMel Gorman __entry->src_pid, __entry->src_tgid, __entry->src_ngid, 547286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 548286549dcSMel Gorman __entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid, 549286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 550286549dcSMel Gorman ); 551dfc68f29SAndy Lutomirski 552dfc68f29SAndy Lutomirski /* 553dfc68f29SAndy Lutomirski * Tracepoint for waking a polling cpu without an IPI. 554dfc68f29SAndy Lutomirski */ 555dfc68f29SAndy Lutomirski TRACE_EVENT(sched_wake_idle_without_ipi, 556dfc68f29SAndy Lutomirski 557dfc68f29SAndy Lutomirski TP_PROTO(int cpu), 558dfc68f29SAndy Lutomirski 559dfc68f29SAndy Lutomirski TP_ARGS(cpu), 560dfc68f29SAndy Lutomirski 561dfc68f29SAndy Lutomirski TP_STRUCT__entry( 562dfc68f29SAndy Lutomirski __field( int, cpu ) 563dfc68f29SAndy Lutomirski ), 564dfc68f29SAndy Lutomirski 565dfc68f29SAndy Lutomirski TP_fast_assign( 566dfc68f29SAndy Lutomirski __entry->cpu = cpu; 567dfc68f29SAndy Lutomirski ), 568dfc68f29SAndy Lutomirski 569dfc68f29SAndy Lutomirski TP_printk("cpu=%d", __entry->cpu) 570dfc68f29SAndy Lutomirski ); 571ea20d929SSteven Rostedt #endif /* _TRACE_SCHED_H */ 572a8d154b0SSteven Rostedt 573a8d154b0SSteven Rostedt /* This part must be outside protection */ 574a8d154b0SSteven Rostedt #include <trace/define_trace.h> 575