1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2d0b6e04aSLi Zefan #undef TRACE_SYSTEM 3d0b6e04aSLi Zefan #define TRACE_SYSTEM sched 4d0b6e04aSLi Zefan 5ad8d75ffSSteven Rostedt #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ) 6ad8d75ffSSteven Rostedt #define _TRACE_SCHED_H 7ad8d75ffSSteven Rostedt 86a3827d7SIngo Molnar #include <linux/sched/numa_balancing.h> 9ad8d75ffSSteven Rostedt #include <linux/tracepoint.h> 104ff16c25SDavid Smith #include <linux/binfmts.h> 11ad8d75ffSSteven Rostedt 12ad8d75ffSSteven Rostedt /* 13ad8d75ffSSteven Rostedt * Tracepoint for calling kthread_stop, performed to end a kthread: 14ad8d75ffSSteven Rostedt */ 15ad8d75ffSSteven Rostedt TRACE_EVENT(sched_kthread_stop, 16ad8d75ffSSteven Rostedt 17ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *t), 18ad8d75ffSSteven Rostedt 19ad8d75ffSSteven Rostedt TP_ARGS(t), 20ad8d75ffSSteven Rostedt 21ad8d75ffSSteven Rostedt TP_STRUCT__entry( 22ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 23ad8d75ffSSteven Rostedt __field( pid_t, pid ) 24ad8d75ffSSteven Rostedt ), 25ad8d75ffSSteven Rostedt 26ad8d75ffSSteven Rostedt TP_fast_assign( 27ad8d75ffSSteven Rostedt memcpy(__entry->comm, t->comm, TASK_COMM_LEN); 28ad8d75ffSSteven Rostedt __entry->pid = t->pid; 29ad8d75ffSSteven Rostedt ), 30ad8d75ffSSteven Rostedt 31434a83c3SIngo Molnar TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) 32ad8d75ffSSteven Rostedt ); 33ad8d75ffSSteven Rostedt 34ad8d75ffSSteven Rostedt /* 35ad8d75ffSSteven Rostedt * Tracepoint for the return value of the kthread stopping: 36ad8d75ffSSteven Rostedt */ 37ad8d75ffSSteven Rostedt TRACE_EVENT(sched_kthread_stop_ret, 38ad8d75ffSSteven Rostedt 39ad8d75ffSSteven Rostedt TP_PROTO(int ret), 40ad8d75ffSSteven Rostedt 41ad8d75ffSSteven Rostedt TP_ARGS(ret), 42ad8d75ffSSteven Rostedt 43ad8d75ffSSteven Rostedt TP_STRUCT__entry( 44ad8d75ffSSteven Rostedt __field( int, ret ) 45ad8d75ffSSteven Rostedt ), 46ad8d75ffSSteven Rostedt 47ad8d75ffSSteven Rostedt TP_fast_assign( 48ad8d75ffSSteven Rostedt __entry->ret = ret; 49ad8d75ffSSteven Rostedt ), 50ad8d75ffSSteven Rostedt 51434a83c3SIngo Molnar TP_printk("ret=%d", __entry->ret) 52ad8d75ffSSteven Rostedt ); 53ad8d75ffSSteven Rostedt 54ad8d75ffSSteven Rostedt /* 55ad8d75ffSSteven Rostedt * Tracepoint for waking up a task: 56ad8d75ffSSteven Rostedt */ 57091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_wakeup_template, 58ad8d75ffSSteven Rostedt 59fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 60ad8d75ffSSteven Rostedt 61fbd705a0SPeter Zijlstra TP_ARGS(__perf_task(p)), 62ad8d75ffSSteven Rostedt 63ad8d75ffSSteven Rostedt TP_STRUCT__entry( 64ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 65ad8d75ffSSteven Rostedt __field( pid_t, pid ) 66ad8d75ffSSteven Rostedt __field( int, prio ) 67ad8d75ffSSteven Rostedt __field( int, success ) 68434a83c3SIngo Molnar __field( int, target_cpu ) 69ad8d75ffSSteven Rostedt ), 70ad8d75ffSSteven Rostedt 71ad8d75ffSSteven Rostedt TP_fast_assign( 72ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 73ad8d75ffSSteven Rostedt __entry->pid = p->pid; 74b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 75fbd705a0SPeter Zijlstra __entry->success = 1; /* rudiment, kill when possible */ 76434a83c3SIngo Molnar __entry->target_cpu = task_cpu(p); 77ad8d75ffSSteven Rostedt ), 78ad8d75ffSSteven Rostedt 79fbd705a0SPeter Zijlstra TP_printk("comm=%s pid=%d prio=%d target_cpu=%03d", 80ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 81fbd705a0SPeter Zijlstra __entry->target_cpu) 82ad8d75ffSSteven Rostedt ); 83ad8d75ffSSteven Rostedt 84fbd705a0SPeter Zijlstra /* 85fbd705a0SPeter Zijlstra * Tracepoint called when waking a task; this tracepoint is guaranteed to be 86fbd705a0SPeter Zijlstra * called from the waking context. 87fbd705a0SPeter Zijlstra */ 88fbd705a0SPeter Zijlstra DEFINE_EVENT(sched_wakeup_template, sched_waking, 89fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 90fbd705a0SPeter Zijlstra TP_ARGS(p)); 91fbd705a0SPeter Zijlstra 92fbd705a0SPeter Zijlstra /* 93fbd705a0SPeter Zijlstra * Tracepoint called when the task is actually woken; p->state == TASK_RUNNNG. 94fbd705a0SPeter Zijlstra * It it not always called from the waking context. 95fbd705a0SPeter Zijlstra */ 9675ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup, 97fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 98fbd705a0SPeter Zijlstra TP_ARGS(p)); 9975ec29abSSteven Rostedt 100ad8d75ffSSteven Rostedt /* 101ad8d75ffSSteven Rostedt * Tracepoint for waking up a new task: 102ad8d75ffSSteven Rostedt */ 10375ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new, 104fbd705a0SPeter Zijlstra TP_PROTO(struct task_struct *p), 105fbd705a0SPeter Zijlstra TP_ARGS(p)); 106ad8d75ffSSteven Rostedt 10702f72694SPeter Zijlstra #ifdef CREATE_TRACE_POINTS 108c73464b1SPeter Zijlstra static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p) 10902f72694SPeter Zijlstra { 1103054426dSPavankumar Kondeti unsigned int state; 1113054426dSPavankumar Kondeti 1128f9fbf09SOleg Nesterov #ifdef CONFIG_SCHED_DEBUG 1138f9fbf09SOleg Nesterov BUG_ON(p != current); 1148f9fbf09SOleg Nesterov #endif /* CONFIG_SCHED_DEBUG */ 11502f72694SPeter Zijlstra 116c73464b1SPeter Zijlstra /* 117c73464b1SPeter Zijlstra * Preemption ignores task state, therefore preempted tasks are always 118c73464b1SPeter Zijlstra * RUNNING (we will not have dequeued if state != RUNNING). 119c73464b1SPeter Zijlstra */ 120efb40f58SPeter Zijlstra if (preempt) 1213f5fe9feSThomas Gleixner return TASK_REPORT_MAX; 122efb40f58SPeter Zijlstra 1233054426dSPavankumar Kondeti /* 1243054426dSPavankumar Kondeti * task_state_index() uses fls() and returns a value from 0-8 range. 1253054426dSPavankumar Kondeti * Decrement it by 1 (except TASK_RUNNING state i.e 0) before using 1263054426dSPavankumar Kondeti * it for left shift operation to get the correct task->state 1273054426dSPavankumar Kondeti * mapping. 1283054426dSPavankumar Kondeti */ 1293054426dSPavankumar Kondeti state = task_state_index(p); 1303054426dSPavankumar Kondeti 1313054426dSPavankumar Kondeti return state ? (1 << (state - 1)) : state; 13202f72694SPeter Zijlstra } 1338f9fbf09SOleg Nesterov #endif /* CREATE_TRACE_POINTS */ 13402f72694SPeter Zijlstra 135ad8d75ffSSteven Rostedt /* 136ad8d75ffSSteven Rostedt * Tracepoint for task switches, performed by the scheduler: 137ad8d75ffSSteven Rostedt */ 138ad8d75ffSSteven Rostedt TRACE_EVENT(sched_switch, 139ad8d75ffSSteven Rostedt 140c73464b1SPeter Zijlstra TP_PROTO(bool preempt, 141c73464b1SPeter Zijlstra struct task_struct *prev, 142ad8d75ffSSteven Rostedt struct task_struct *next), 143ad8d75ffSSteven Rostedt 144c73464b1SPeter Zijlstra TP_ARGS(preempt, prev, next), 145ad8d75ffSSteven Rostedt 146ad8d75ffSSteven Rostedt TP_STRUCT__entry( 147ad8d75ffSSteven Rostedt __array( char, prev_comm, TASK_COMM_LEN ) 148ad8d75ffSSteven Rostedt __field( pid_t, prev_pid ) 149ad8d75ffSSteven Rostedt __field( int, prev_prio ) 150937cdb9dSSteven Rostedt __field( long, prev_state ) 151ad8d75ffSSteven Rostedt __array( char, next_comm, TASK_COMM_LEN ) 152ad8d75ffSSteven Rostedt __field( pid_t, next_pid ) 153ad8d75ffSSteven Rostedt __field( int, next_prio ) 154ad8d75ffSSteven Rostedt ), 155ad8d75ffSSteven Rostedt 156ad8d75ffSSteven Rostedt TP_fast_assign( 157ad8d75ffSSteven Rostedt memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); 158ad8d75ffSSteven Rostedt __entry->prev_pid = prev->pid; 159ad8d75ffSSteven Rostedt __entry->prev_prio = prev->prio; 160c73464b1SPeter Zijlstra __entry->prev_state = __trace_sched_switch_state(preempt, prev); 161ad8d75ffSSteven Rostedt memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); 162ad8d75ffSSteven Rostedt __entry->next_pid = next->pid; 163ad8d75ffSSteven Rostedt __entry->next_prio = next->prio; 164b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE */ 165ad8d75ffSSteven Rostedt ), 166ad8d75ffSSteven Rostedt 167557ab425SPeter 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", 168ad8d75ffSSteven Rostedt __entry->prev_comm, __entry->prev_pid, __entry->prev_prio, 169efb40f58SPeter Zijlstra 17006eb6184SPeter Zijlstra (__entry->prev_state & (TASK_REPORT_MAX - 1)) ? 17106eb6184SPeter Zijlstra __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|", 172ff28915fSUwe Kleine-König { TASK_INTERRUPTIBLE, "S" }, 173ff28915fSUwe Kleine-König { TASK_UNINTERRUPTIBLE, "D" }, 174ff28915fSUwe Kleine-König { __TASK_STOPPED, "T" }, 175ff28915fSUwe Kleine-König { __TASK_TRACED, "t" }, 176ff28915fSUwe Kleine-König { EXIT_DEAD, "X" }, 177ff28915fSUwe Kleine-König { EXIT_ZOMBIE, "Z" }, 178ff28915fSUwe Kleine-König { TASK_PARKED, "P" }, 179ff28915fSUwe Kleine-König { TASK_DEAD, "I" }) : 180efb40f58SPeter Zijlstra "R", 181efb40f58SPeter Zijlstra 1823f5fe9feSThomas Gleixner __entry->prev_state & TASK_REPORT_MAX ? "+" : "", 183ad8d75ffSSteven Rostedt __entry->next_comm, __entry->next_pid, __entry->next_prio) 184ad8d75ffSSteven Rostedt ); 185ad8d75ffSSteven Rostedt 186ad8d75ffSSteven Rostedt /* 187ad8d75ffSSteven Rostedt * Tracepoint for a task being migrated: 188ad8d75ffSSteven Rostedt */ 189ad8d75ffSSteven Rostedt TRACE_EVENT(sched_migrate_task, 190ad8d75ffSSteven Rostedt 191de1d7286SMathieu Desnoyers TP_PROTO(struct task_struct *p, int dest_cpu), 192ad8d75ffSSteven Rostedt 193de1d7286SMathieu Desnoyers TP_ARGS(p, dest_cpu), 194ad8d75ffSSteven Rostedt 195ad8d75ffSSteven Rostedt TP_STRUCT__entry( 196ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 197ad8d75ffSSteven Rostedt __field( pid_t, pid ) 198ad8d75ffSSteven Rostedt __field( int, prio ) 199ad8d75ffSSteven Rostedt __field( int, orig_cpu ) 200ad8d75ffSSteven Rostedt __field( int, dest_cpu ) 201ad8d75ffSSteven Rostedt ), 202ad8d75ffSSteven Rostedt 203ad8d75ffSSteven Rostedt TP_fast_assign( 204ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 205ad8d75ffSSteven Rostedt __entry->pid = p->pid; 206b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 207de1d7286SMathieu Desnoyers __entry->orig_cpu = task_cpu(p); 208ad8d75ffSSteven Rostedt __entry->dest_cpu = dest_cpu; 209ad8d75ffSSteven Rostedt ), 210ad8d75ffSSteven Rostedt 211434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d", 212ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 213ad8d75ffSSteven Rostedt __entry->orig_cpu, __entry->dest_cpu) 214ad8d75ffSSteven Rostedt ); 215ad8d75ffSSteven Rostedt 216091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_process_template, 217ad8d75ffSSteven Rostedt 218ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 219ad8d75ffSSteven Rostedt 220ad8d75ffSSteven Rostedt TP_ARGS(p), 221ad8d75ffSSteven Rostedt 222ad8d75ffSSteven Rostedt TP_STRUCT__entry( 223ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 224ad8d75ffSSteven Rostedt __field( pid_t, pid ) 225ad8d75ffSSteven Rostedt __field( int, prio ) 226ad8d75ffSSteven Rostedt ), 227ad8d75ffSSteven Rostedt 228ad8d75ffSSteven Rostedt TP_fast_assign( 229ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 230ad8d75ffSSteven Rostedt __entry->pid = p->pid; 231b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 232ad8d75ffSSteven Rostedt ), 233ad8d75ffSSteven Rostedt 234434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 235ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 236ad8d75ffSSteven Rostedt ); 237ad8d75ffSSteven Rostedt 238ad8d75ffSSteven Rostedt /* 23975ec29abSSteven Rostedt * Tracepoint for freeing a task: 24075ec29abSSteven Rostedt */ 24175ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_free, 24275ec29abSSteven Rostedt TP_PROTO(struct task_struct *p), 24375ec29abSSteven Rostedt TP_ARGS(p)); 24475ec29abSSteven Rostedt 24575ec29abSSteven Rostedt /* 246ad8d75ffSSteven Rostedt * Tracepoint for a task exiting: 247ad8d75ffSSteven Rostedt */ 24875ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_exit, 249ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 25075ec29abSSteven Rostedt TP_ARGS(p)); 251ad8d75ffSSteven Rostedt 252ad8d75ffSSteven Rostedt /* 253210f7669SLi Zefan * Tracepoint for waiting on task to unschedule: 254210f7669SLi Zefan */ 255210f7669SLi Zefan DEFINE_EVENT(sched_process_template, sched_wait_task, 256210f7669SLi Zefan TP_PROTO(struct task_struct *p), 257210f7669SLi Zefan TP_ARGS(p)); 258210f7669SLi Zefan 259210f7669SLi Zefan /* 260ad8d75ffSSteven Rostedt * Tracepoint for a waiting task: 261ad8d75ffSSteven Rostedt */ 262ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_wait, 263ad8d75ffSSteven Rostedt 264ad8d75ffSSteven Rostedt TP_PROTO(struct pid *pid), 265ad8d75ffSSteven Rostedt 266ad8d75ffSSteven Rostedt TP_ARGS(pid), 267ad8d75ffSSteven Rostedt 268ad8d75ffSSteven Rostedt TP_STRUCT__entry( 269ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 270ad8d75ffSSteven Rostedt __field( pid_t, pid ) 271ad8d75ffSSteven Rostedt __field( int, prio ) 272ad8d75ffSSteven Rostedt ), 273ad8d75ffSSteven Rostedt 274ad8d75ffSSteven Rostedt TP_fast_assign( 275ad8d75ffSSteven Rostedt memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 276ad8d75ffSSteven Rostedt __entry->pid = pid_nr(pid); 277b91473ffSPeter Zijlstra __entry->prio = current->prio; /* XXX SCHED_DEADLINE */ 278ad8d75ffSSteven Rostedt ), 279ad8d75ffSSteven Rostedt 280434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 281ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 282ad8d75ffSSteven Rostedt ); 283ad8d75ffSSteven Rostedt 284ad8d75ffSSteven Rostedt /* 285ad8d75ffSSteven Rostedt * Tracepoint for do_fork: 286ad8d75ffSSteven Rostedt */ 287ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_fork, 288ad8d75ffSSteven Rostedt 289ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *parent, struct task_struct *child), 290ad8d75ffSSteven Rostedt 291ad8d75ffSSteven Rostedt TP_ARGS(parent, child), 292ad8d75ffSSteven Rostedt 293ad8d75ffSSteven Rostedt TP_STRUCT__entry( 294ad8d75ffSSteven Rostedt __array( char, parent_comm, TASK_COMM_LEN ) 295ad8d75ffSSteven Rostedt __field( pid_t, parent_pid ) 296ad8d75ffSSteven Rostedt __array( char, child_comm, TASK_COMM_LEN ) 297ad8d75ffSSteven Rostedt __field( pid_t, child_pid ) 298ad8d75ffSSteven Rostedt ), 299ad8d75ffSSteven Rostedt 300ad8d75ffSSteven Rostedt TP_fast_assign( 301ad8d75ffSSteven Rostedt memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN); 302ad8d75ffSSteven Rostedt __entry->parent_pid = parent->pid; 303ad8d75ffSSteven Rostedt memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN); 304ad8d75ffSSteven Rostedt __entry->child_pid = child->pid; 305ad8d75ffSSteven Rostedt ), 306ad8d75ffSSteven Rostedt 307434a83c3SIngo Molnar TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d", 308ad8d75ffSSteven Rostedt __entry->parent_comm, __entry->parent_pid, 309ad8d75ffSSteven Rostedt __entry->child_comm, __entry->child_pid) 310ad8d75ffSSteven Rostedt ); 311ad8d75ffSSteven Rostedt 312ad8d75ffSSteven Rostedt /* 3134ff16c25SDavid Smith * Tracepoint for exec: 3144ff16c25SDavid Smith */ 3154ff16c25SDavid Smith TRACE_EVENT(sched_process_exec, 3164ff16c25SDavid Smith 3174ff16c25SDavid Smith TP_PROTO(struct task_struct *p, pid_t old_pid, 3184ff16c25SDavid Smith struct linux_binprm *bprm), 3194ff16c25SDavid Smith 3204ff16c25SDavid Smith TP_ARGS(p, old_pid, bprm), 3214ff16c25SDavid Smith 3224ff16c25SDavid Smith TP_STRUCT__entry( 3234ff16c25SDavid Smith __string( filename, bprm->filename ) 3244ff16c25SDavid Smith __field( pid_t, pid ) 3254ff16c25SDavid Smith __field( pid_t, old_pid ) 3264ff16c25SDavid Smith ), 3274ff16c25SDavid Smith 3284ff16c25SDavid Smith TP_fast_assign( 3294ff16c25SDavid Smith __assign_str(filename, bprm->filename); 3304ff16c25SDavid Smith __entry->pid = p->pid; 3316308191fSOleg Nesterov __entry->old_pid = old_pid; 3324ff16c25SDavid Smith ), 3334ff16c25SDavid Smith 3344ff16c25SDavid Smith TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename), 3354ff16c25SDavid Smith __entry->pid, __entry->old_pid) 3364ff16c25SDavid Smith ); 3374ff16c25SDavid Smith 3382a09b5deSYafang Shao 3392a09b5deSYafang Shao #ifdef CONFIG_SCHEDSTATS 3402a09b5deSYafang Shao #define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT 3412a09b5deSYafang Shao #define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS 3422a09b5deSYafang Shao #else 3432a09b5deSYafang Shao #define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT_NOP 3442a09b5deSYafang Shao #define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS_NOP 3452a09b5deSYafang Shao #endif 3462a09b5deSYafang Shao 3474ff16c25SDavid Smith /* 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 */ 3512a09b5deSYafang Shao DECLARE_EVENT_CLASS_SCHEDSTAT(sched_stat_template, 352768d0c27SPeter Zijlstra 353768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 354768d0c27SPeter Zijlstra 35512473965SOleg Nesterov TP_ARGS(__perf_task(tsk), __perf_count(delay)), 356768d0c27SPeter Zijlstra 357768d0c27SPeter Zijlstra TP_STRUCT__entry( 358768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 359768d0c27SPeter Zijlstra __field( pid_t, pid ) 360768d0c27SPeter Zijlstra __field( u64, delay ) 361768d0c27SPeter Zijlstra ), 362768d0c27SPeter Zijlstra 363768d0c27SPeter Zijlstra TP_fast_assign( 364768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 365768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 366768d0c27SPeter Zijlstra __entry->delay = delay; 367768d0c27SPeter Zijlstra ), 368768d0c27SPeter Zijlstra 369434a83c3SIngo Molnar TP_printk("comm=%s pid=%d delay=%Lu [ns]", 370768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 371768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 372768d0c27SPeter Zijlstra ); 373768d0c27SPeter Zijlstra 37475ec29abSSteven Rostedt /* 37575ec29abSSteven Rostedt * Tracepoint for accounting wait time (time the task is runnable 37675ec29abSSteven Rostedt * but not actually running due to scheduler contention). 37775ec29abSSteven Rostedt */ 3782a09b5deSYafang Shao DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_wait, 37975ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 38075ec29abSSteven Rostedt TP_ARGS(tsk, delay)); 38175ec29abSSteven Rostedt 38275ec29abSSteven Rostedt /* 38375ec29abSSteven Rostedt * Tracepoint for accounting sleep time (time the task is not runnable, 38475ec29abSSteven Rostedt * including iowait, see below). 38575ec29abSSteven Rostedt */ 3862a09b5deSYafang Shao DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_sleep, 38775ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 388470dda74SLi Zefan TP_ARGS(tsk, delay)); 38975ec29abSSteven Rostedt 39075ec29abSSteven Rostedt /* 39175ec29abSSteven Rostedt * Tracepoint for accounting iowait time (time the task is not runnable 39275ec29abSSteven Rostedt * due to waiting on IO to complete). 39375ec29abSSteven Rostedt */ 3942a09b5deSYafang Shao DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_iowait, 39575ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 396470dda74SLi Zefan TP_ARGS(tsk, delay)); 39775ec29abSSteven Rostedt 398768d0c27SPeter Zijlstra /* 399b781a602SAndrew Vagin * Tracepoint for accounting blocked time (time the task is in uninterruptible). 400b781a602SAndrew Vagin */ 4012a09b5deSYafang Shao DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_blocked, 402b781a602SAndrew Vagin TP_PROTO(struct task_struct *tsk, u64 delay), 403b781a602SAndrew Vagin TP_ARGS(tsk, delay)); 404b781a602SAndrew Vagin 405b781a602SAndrew Vagin /* 406f977bb49SIngo Molnar * Tracepoint for accounting runtime (time the task is executing 407f977bb49SIngo Molnar * on a CPU). 408f977bb49SIngo Molnar */ 40936009d07SOleg Nesterov DECLARE_EVENT_CLASS(sched_stat_runtime, 410f977bb49SIngo Molnar 411f977bb49SIngo Molnar TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 412f977bb49SIngo Molnar 41312473965SOleg Nesterov TP_ARGS(tsk, __perf_count(runtime), vruntime), 414f977bb49SIngo Molnar 415f977bb49SIngo Molnar TP_STRUCT__entry( 416f977bb49SIngo Molnar __array( char, comm, TASK_COMM_LEN ) 417f977bb49SIngo Molnar __field( pid_t, pid ) 418f977bb49SIngo Molnar __field( u64, runtime ) 419f977bb49SIngo Molnar __field( u64, vruntime ) 420f977bb49SIngo Molnar ), 421f977bb49SIngo Molnar 422f977bb49SIngo Molnar TP_fast_assign( 423f977bb49SIngo Molnar memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 424f977bb49SIngo Molnar __entry->pid = tsk->pid; 425f977bb49SIngo Molnar __entry->runtime = runtime; 426f977bb49SIngo Molnar __entry->vruntime = vruntime; 427f977bb49SIngo Molnar ), 428f977bb49SIngo Molnar 429434a83c3SIngo Molnar TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]", 430f977bb49SIngo Molnar __entry->comm, __entry->pid, 431f977bb49SIngo Molnar (unsigned long long)__entry->runtime, 432f977bb49SIngo Molnar (unsigned long long)__entry->vruntime) 433f977bb49SIngo Molnar ); 434f977bb49SIngo Molnar 43536009d07SOleg Nesterov DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime, 43636009d07SOleg Nesterov TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 43736009d07SOleg Nesterov TP_ARGS(tsk, runtime, vruntime)); 43836009d07SOleg Nesterov 439a8027073SSteven Rostedt /* 440a8027073SSteven Rostedt * Tracepoint for showing priority inheritance modifying a tasks 441a8027073SSteven Rostedt * priority. 442a8027073SSteven Rostedt */ 443a8027073SSteven Rostedt TRACE_EVENT(sched_pi_setprio, 444a8027073SSteven Rostedt 445b91473ffSPeter Zijlstra TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task), 446a8027073SSteven Rostedt 447b91473ffSPeter Zijlstra TP_ARGS(tsk, pi_task), 448a8027073SSteven Rostedt 449a8027073SSteven Rostedt TP_STRUCT__entry( 450a8027073SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 451a8027073SSteven Rostedt __field( pid_t, pid ) 452a8027073SSteven Rostedt __field( int, oldprio ) 453a8027073SSteven Rostedt __field( int, newprio ) 454a8027073SSteven Rostedt ), 455a8027073SSteven Rostedt 456a8027073SSteven Rostedt TP_fast_assign( 457a8027073SSteven Rostedt memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 458a8027073SSteven Rostedt __entry->pid = tsk->pid; 459a8027073SSteven Rostedt __entry->oldprio = tsk->prio; 4604ff648deSSebastian Andrzej Siewior __entry->newprio = pi_task ? 4614ff648deSSebastian Andrzej Siewior min(tsk->normal_prio, pi_task->prio) : 4624ff648deSSebastian Andrzej Siewior tsk->normal_prio; 463b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE bits missing */ 464a8027073SSteven Rostedt ), 465a8027073SSteven Rostedt 466a8027073SSteven Rostedt TP_printk("comm=%s pid=%d oldprio=%d newprio=%d", 467a8027073SSteven Rostedt __entry->comm, __entry->pid, 468a8027073SSteven Rostedt __entry->oldprio, __entry->newprio) 469a8027073SSteven Rostedt ); 470a8027073SSteven Rostedt 4716a716c90SOleg Nesterov #ifdef CONFIG_DETECT_HUNG_TASK 4726a716c90SOleg Nesterov TRACE_EVENT(sched_process_hang, 4736a716c90SOleg Nesterov TP_PROTO(struct task_struct *tsk), 4746a716c90SOleg Nesterov TP_ARGS(tsk), 4756a716c90SOleg Nesterov 4766a716c90SOleg Nesterov TP_STRUCT__entry( 4776a716c90SOleg Nesterov __array( char, comm, TASK_COMM_LEN ) 4786a716c90SOleg Nesterov __field( pid_t, pid ) 4796a716c90SOleg Nesterov ), 4806a716c90SOleg Nesterov 4816a716c90SOleg Nesterov TP_fast_assign( 4826a716c90SOleg Nesterov memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 4836a716c90SOleg Nesterov __entry->pid = tsk->pid; 4846a716c90SOleg Nesterov ), 4856a716c90SOleg Nesterov 4866a716c90SOleg Nesterov TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) 4876a716c90SOleg Nesterov ); 4886a716c90SOleg Nesterov #endif /* CONFIG_DETECT_HUNG_TASK */ 4896a716c90SOleg Nesterov 490286549dcSMel Gorman DECLARE_EVENT_CLASS(sched_move_task_template, 491286549dcSMel Gorman 492286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 493286549dcSMel Gorman 494286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu), 495286549dcSMel Gorman 496286549dcSMel Gorman TP_STRUCT__entry( 497286549dcSMel Gorman __field( pid_t, pid ) 498286549dcSMel Gorman __field( pid_t, tgid ) 499286549dcSMel Gorman __field( pid_t, ngid ) 500286549dcSMel Gorman __field( int, src_cpu ) 501286549dcSMel Gorman __field( int, src_nid ) 502286549dcSMel Gorman __field( int, dst_cpu ) 503286549dcSMel Gorman __field( int, dst_nid ) 504286549dcSMel Gorman ), 505286549dcSMel Gorman 506286549dcSMel Gorman TP_fast_assign( 507286549dcSMel Gorman __entry->pid = task_pid_nr(tsk); 508286549dcSMel Gorman __entry->tgid = task_tgid_nr(tsk); 509286549dcSMel Gorman __entry->ngid = task_numa_group_id(tsk); 510286549dcSMel Gorman __entry->src_cpu = src_cpu; 511286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 512286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 513286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 514286549dcSMel Gorman ), 515286549dcSMel Gorman 516286549dcSMel Gorman TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d", 517286549dcSMel Gorman __entry->pid, __entry->tgid, __entry->ngid, 518286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 519286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 520286549dcSMel Gorman ); 521286549dcSMel Gorman 522286549dcSMel Gorman /* 523286549dcSMel Gorman * Tracks migration of tasks from one runqueue to another. Can be used to 524286549dcSMel Gorman * detect if automatic NUMA balancing is bouncing between nodes 525286549dcSMel Gorman */ 526286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_move_numa, 527286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 528286549dcSMel Gorman 529286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 530286549dcSMel Gorman ); 531286549dcSMel Gorman 532286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_stick_numa, 533286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 534286549dcSMel Gorman 535286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 536286549dcSMel Gorman ); 537286549dcSMel Gorman 538286549dcSMel Gorman TRACE_EVENT(sched_swap_numa, 539286549dcSMel Gorman 540286549dcSMel Gorman TP_PROTO(struct task_struct *src_tsk, int src_cpu, 541286549dcSMel Gorman struct task_struct *dst_tsk, int dst_cpu), 542286549dcSMel Gorman 543286549dcSMel Gorman TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu), 544286549dcSMel Gorman 545286549dcSMel Gorman TP_STRUCT__entry( 546286549dcSMel Gorman __field( pid_t, src_pid ) 547286549dcSMel Gorman __field( pid_t, src_tgid ) 548286549dcSMel Gorman __field( pid_t, src_ngid ) 549286549dcSMel Gorman __field( int, src_cpu ) 550286549dcSMel Gorman __field( int, src_nid ) 551286549dcSMel Gorman __field( pid_t, dst_pid ) 552286549dcSMel Gorman __field( pid_t, dst_tgid ) 553286549dcSMel Gorman __field( pid_t, dst_ngid ) 554286549dcSMel Gorman __field( int, dst_cpu ) 555286549dcSMel Gorman __field( int, dst_nid ) 556286549dcSMel Gorman ), 557286549dcSMel Gorman 558286549dcSMel Gorman TP_fast_assign( 559286549dcSMel Gorman __entry->src_pid = task_pid_nr(src_tsk); 560286549dcSMel Gorman __entry->src_tgid = task_tgid_nr(src_tsk); 561286549dcSMel Gorman __entry->src_ngid = task_numa_group_id(src_tsk); 562286549dcSMel Gorman __entry->src_cpu = src_cpu; 563286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 564286549dcSMel Gorman __entry->dst_pid = task_pid_nr(dst_tsk); 565286549dcSMel Gorman __entry->dst_tgid = task_tgid_nr(dst_tsk); 566286549dcSMel Gorman __entry->dst_ngid = task_numa_group_id(dst_tsk); 567286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 568286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 569286549dcSMel Gorman ), 570286549dcSMel Gorman 571286549dcSMel 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", 572286549dcSMel Gorman __entry->src_pid, __entry->src_tgid, __entry->src_ngid, 573286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 574286549dcSMel Gorman __entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid, 575286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 576286549dcSMel Gorman ); 577dfc68f29SAndy Lutomirski 578dfc68f29SAndy Lutomirski /* 579dfc68f29SAndy Lutomirski * Tracepoint for waking a polling cpu without an IPI. 580dfc68f29SAndy Lutomirski */ 581dfc68f29SAndy Lutomirski TRACE_EVENT(sched_wake_idle_without_ipi, 582dfc68f29SAndy Lutomirski 583dfc68f29SAndy Lutomirski TP_PROTO(int cpu), 584dfc68f29SAndy Lutomirski 585dfc68f29SAndy Lutomirski TP_ARGS(cpu), 586dfc68f29SAndy Lutomirski 587dfc68f29SAndy Lutomirski TP_STRUCT__entry( 588dfc68f29SAndy Lutomirski __field( int, cpu ) 589dfc68f29SAndy Lutomirski ), 590dfc68f29SAndy Lutomirski 591dfc68f29SAndy Lutomirski TP_fast_assign( 592dfc68f29SAndy Lutomirski __entry->cpu = cpu; 593dfc68f29SAndy Lutomirski ), 594dfc68f29SAndy Lutomirski 595dfc68f29SAndy Lutomirski TP_printk("cpu=%d", __entry->cpu) 596dfc68f29SAndy Lutomirski ); 597ad8d75ffSSteven Rostedt #endif /* _TRACE_SCHED_H */ 598ad8d75ffSSteven Rostedt 599ad8d75ffSSteven Rostedt /* This part must be outside protection */ 600ad8d75ffSSteven Rostedt #include <trace/define_trace.h> 601