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 { 1108f9fbf09SOleg Nesterov #ifdef CONFIG_SCHED_DEBUG 1118f9fbf09SOleg Nesterov BUG_ON(p != current); 1128f9fbf09SOleg Nesterov #endif /* CONFIG_SCHED_DEBUG */ 11302f72694SPeter Zijlstra 114c73464b1SPeter Zijlstra /* 115c73464b1SPeter Zijlstra * Preemption ignores task state, therefore preempted tasks are always 116c73464b1SPeter Zijlstra * RUNNING (we will not have dequeued if state != RUNNING). 117c73464b1SPeter Zijlstra */ 118efb40f58SPeter Zijlstra if (preempt) 119efb40f58SPeter Zijlstra return TASK_STATE_MAX; 120efb40f58SPeter Zijlstra 121efb40f58SPeter Zijlstra return __get_task_state(p); 12202f72694SPeter Zijlstra } 1238f9fbf09SOleg Nesterov #endif /* CREATE_TRACE_POINTS */ 12402f72694SPeter Zijlstra 125ad8d75ffSSteven Rostedt /* 126ad8d75ffSSteven Rostedt * Tracepoint for task switches, performed by the scheduler: 127ad8d75ffSSteven Rostedt */ 128ad8d75ffSSteven Rostedt TRACE_EVENT(sched_switch, 129ad8d75ffSSteven Rostedt 130c73464b1SPeter Zijlstra TP_PROTO(bool preempt, 131c73464b1SPeter Zijlstra struct task_struct *prev, 132ad8d75ffSSteven Rostedt struct task_struct *next), 133ad8d75ffSSteven Rostedt 134c73464b1SPeter Zijlstra TP_ARGS(preempt, prev, next), 135ad8d75ffSSteven Rostedt 136ad8d75ffSSteven Rostedt TP_STRUCT__entry( 137ad8d75ffSSteven Rostedt __array( char, prev_comm, TASK_COMM_LEN ) 138ad8d75ffSSteven Rostedt __field( pid_t, prev_pid ) 139ad8d75ffSSteven Rostedt __field( int, prev_prio ) 140937cdb9dSSteven Rostedt __field( long, prev_state ) 141ad8d75ffSSteven Rostedt __array( char, next_comm, TASK_COMM_LEN ) 142ad8d75ffSSteven Rostedt __field( pid_t, next_pid ) 143ad8d75ffSSteven Rostedt __field( int, next_prio ) 144ad8d75ffSSteven Rostedt ), 145ad8d75ffSSteven Rostedt 146ad8d75ffSSteven Rostedt TP_fast_assign( 147ad8d75ffSSteven Rostedt memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN); 148ad8d75ffSSteven Rostedt __entry->prev_pid = prev->pid; 149ad8d75ffSSteven Rostedt __entry->prev_prio = prev->prio; 150c73464b1SPeter Zijlstra __entry->prev_state = __trace_sched_switch_state(preempt, prev); 151ad8d75ffSSteven Rostedt memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN); 152ad8d75ffSSteven Rostedt __entry->next_pid = next->pid; 153ad8d75ffSSteven Rostedt __entry->next_prio = next->prio; 154b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE */ 155ad8d75ffSSteven Rostedt ), 156ad8d75ffSSteven Rostedt 157557ab425SPeter 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", 158ad8d75ffSSteven Rostedt __entry->prev_comm, __entry->prev_pid, __entry->prev_prio, 159efb40f58SPeter Zijlstra 16006eb6184SPeter Zijlstra (__entry->prev_state & (TASK_REPORT_MAX - 1)) ? 16106eb6184SPeter Zijlstra __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|", 162efb40f58SPeter Zijlstra { 0x01, "S" }, { 0x02, "D" }, { 0x04, "T" }, 16306eb6184SPeter Zijlstra { 0x08, "t" }, { 0x10, "X" }, { 0x20, "Z" }, 1648ef9925bSPeter Zijlstra { 0x40, "P" }, { 0x80, "I" }) : 165efb40f58SPeter Zijlstra "R", 166efb40f58SPeter Zijlstra 167557ab425SPeter Zijlstra __entry->prev_state & TASK_STATE_MAX ? "+" : "", 168ad8d75ffSSteven Rostedt __entry->next_comm, __entry->next_pid, __entry->next_prio) 169ad8d75ffSSteven Rostedt ); 170ad8d75ffSSteven Rostedt 171ad8d75ffSSteven Rostedt /* 172ad8d75ffSSteven Rostedt * Tracepoint for a task being migrated: 173ad8d75ffSSteven Rostedt */ 174ad8d75ffSSteven Rostedt TRACE_EVENT(sched_migrate_task, 175ad8d75ffSSteven Rostedt 176de1d7286SMathieu Desnoyers TP_PROTO(struct task_struct *p, int dest_cpu), 177ad8d75ffSSteven Rostedt 178de1d7286SMathieu Desnoyers TP_ARGS(p, dest_cpu), 179ad8d75ffSSteven Rostedt 180ad8d75ffSSteven Rostedt TP_STRUCT__entry( 181ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 182ad8d75ffSSteven Rostedt __field( pid_t, pid ) 183ad8d75ffSSteven Rostedt __field( int, prio ) 184ad8d75ffSSteven Rostedt __field( int, orig_cpu ) 185ad8d75ffSSteven Rostedt __field( int, dest_cpu ) 186ad8d75ffSSteven Rostedt ), 187ad8d75ffSSteven Rostedt 188ad8d75ffSSteven Rostedt TP_fast_assign( 189ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 190ad8d75ffSSteven Rostedt __entry->pid = p->pid; 191b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 192de1d7286SMathieu Desnoyers __entry->orig_cpu = task_cpu(p); 193ad8d75ffSSteven Rostedt __entry->dest_cpu = dest_cpu; 194ad8d75ffSSteven Rostedt ), 195ad8d75ffSSteven Rostedt 196434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d", 197ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio, 198ad8d75ffSSteven Rostedt __entry->orig_cpu, __entry->dest_cpu) 199ad8d75ffSSteven Rostedt ); 200ad8d75ffSSteven Rostedt 201091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_process_template, 202ad8d75ffSSteven Rostedt 203ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 204ad8d75ffSSteven Rostedt 205ad8d75ffSSteven Rostedt TP_ARGS(p), 206ad8d75ffSSteven Rostedt 207ad8d75ffSSteven Rostedt TP_STRUCT__entry( 208ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 209ad8d75ffSSteven Rostedt __field( pid_t, pid ) 210ad8d75ffSSteven Rostedt __field( int, prio ) 211ad8d75ffSSteven Rostedt ), 212ad8d75ffSSteven Rostedt 213ad8d75ffSSteven Rostedt TP_fast_assign( 214ad8d75ffSSteven Rostedt memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 215ad8d75ffSSteven Rostedt __entry->pid = p->pid; 216b91473ffSPeter Zijlstra __entry->prio = p->prio; /* XXX SCHED_DEADLINE */ 217ad8d75ffSSteven Rostedt ), 218ad8d75ffSSteven Rostedt 219434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 220ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 221ad8d75ffSSteven Rostedt ); 222ad8d75ffSSteven Rostedt 223ad8d75ffSSteven Rostedt /* 22475ec29abSSteven Rostedt * Tracepoint for freeing a task: 22575ec29abSSteven Rostedt */ 22675ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_free, 22775ec29abSSteven Rostedt TP_PROTO(struct task_struct *p), 22875ec29abSSteven Rostedt TP_ARGS(p)); 22975ec29abSSteven Rostedt 23075ec29abSSteven Rostedt 23175ec29abSSteven Rostedt /* 232ad8d75ffSSteven Rostedt * Tracepoint for a task exiting: 233ad8d75ffSSteven Rostedt */ 23475ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_exit, 235ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *p), 23675ec29abSSteven Rostedt TP_ARGS(p)); 237ad8d75ffSSteven Rostedt 238ad8d75ffSSteven Rostedt /* 239210f7669SLi Zefan * Tracepoint for waiting on task to unschedule: 240210f7669SLi Zefan */ 241210f7669SLi Zefan DEFINE_EVENT(sched_process_template, sched_wait_task, 242210f7669SLi Zefan TP_PROTO(struct task_struct *p), 243210f7669SLi Zefan TP_ARGS(p)); 244210f7669SLi Zefan 245210f7669SLi Zefan /* 246ad8d75ffSSteven Rostedt * Tracepoint for a waiting task: 247ad8d75ffSSteven Rostedt */ 248ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_wait, 249ad8d75ffSSteven Rostedt 250ad8d75ffSSteven Rostedt TP_PROTO(struct pid *pid), 251ad8d75ffSSteven Rostedt 252ad8d75ffSSteven Rostedt TP_ARGS(pid), 253ad8d75ffSSteven Rostedt 254ad8d75ffSSteven Rostedt TP_STRUCT__entry( 255ad8d75ffSSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 256ad8d75ffSSteven Rostedt __field( pid_t, pid ) 257ad8d75ffSSteven Rostedt __field( int, prio ) 258ad8d75ffSSteven Rostedt ), 259ad8d75ffSSteven Rostedt 260ad8d75ffSSteven Rostedt TP_fast_assign( 261ad8d75ffSSteven Rostedt memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 262ad8d75ffSSteven Rostedt __entry->pid = pid_nr(pid); 263b91473ffSPeter Zijlstra __entry->prio = current->prio; /* XXX SCHED_DEADLINE */ 264ad8d75ffSSteven Rostedt ), 265ad8d75ffSSteven Rostedt 266434a83c3SIngo Molnar TP_printk("comm=%s pid=%d prio=%d", 267ad8d75ffSSteven Rostedt __entry->comm, __entry->pid, __entry->prio) 268ad8d75ffSSteven Rostedt ); 269ad8d75ffSSteven Rostedt 270ad8d75ffSSteven Rostedt /* 271ad8d75ffSSteven Rostedt * Tracepoint for do_fork: 272ad8d75ffSSteven Rostedt */ 273ad8d75ffSSteven Rostedt TRACE_EVENT(sched_process_fork, 274ad8d75ffSSteven Rostedt 275ad8d75ffSSteven Rostedt TP_PROTO(struct task_struct *parent, struct task_struct *child), 276ad8d75ffSSteven Rostedt 277ad8d75ffSSteven Rostedt TP_ARGS(parent, child), 278ad8d75ffSSteven Rostedt 279ad8d75ffSSteven Rostedt TP_STRUCT__entry( 280ad8d75ffSSteven Rostedt __array( char, parent_comm, TASK_COMM_LEN ) 281ad8d75ffSSteven Rostedt __field( pid_t, parent_pid ) 282ad8d75ffSSteven Rostedt __array( char, child_comm, TASK_COMM_LEN ) 283ad8d75ffSSteven Rostedt __field( pid_t, child_pid ) 284ad8d75ffSSteven Rostedt ), 285ad8d75ffSSteven Rostedt 286ad8d75ffSSteven Rostedt TP_fast_assign( 287ad8d75ffSSteven Rostedt memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN); 288ad8d75ffSSteven Rostedt __entry->parent_pid = parent->pid; 289ad8d75ffSSteven Rostedt memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN); 290ad8d75ffSSteven Rostedt __entry->child_pid = child->pid; 291ad8d75ffSSteven Rostedt ), 292ad8d75ffSSteven Rostedt 293434a83c3SIngo Molnar TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d", 294ad8d75ffSSteven Rostedt __entry->parent_comm, __entry->parent_pid, 295ad8d75ffSSteven Rostedt __entry->child_comm, __entry->child_pid) 296ad8d75ffSSteven Rostedt ); 297ad8d75ffSSteven Rostedt 298ad8d75ffSSteven Rostedt /* 2994ff16c25SDavid Smith * Tracepoint for exec: 3004ff16c25SDavid Smith */ 3014ff16c25SDavid Smith TRACE_EVENT(sched_process_exec, 3024ff16c25SDavid Smith 3034ff16c25SDavid Smith TP_PROTO(struct task_struct *p, pid_t old_pid, 3044ff16c25SDavid Smith struct linux_binprm *bprm), 3054ff16c25SDavid Smith 3064ff16c25SDavid Smith TP_ARGS(p, old_pid, bprm), 3074ff16c25SDavid Smith 3084ff16c25SDavid Smith TP_STRUCT__entry( 3094ff16c25SDavid Smith __string( filename, bprm->filename ) 3104ff16c25SDavid Smith __field( pid_t, pid ) 3114ff16c25SDavid Smith __field( pid_t, old_pid ) 3124ff16c25SDavid Smith ), 3134ff16c25SDavid Smith 3144ff16c25SDavid Smith TP_fast_assign( 3154ff16c25SDavid Smith __assign_str(filename, bprm->filename); 3164ff16c25SDavid Smith __entry->pid = p->pid; 3176308191fSOleg Nesterov __entry->old_pid = old_pid; 3184ff16c25SDavid Smith ), 3194ff16c25SDavid Smith 3204ff16c25SDavid Smith TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename), 3214ff16c25SDavid Smith __entry->pid, __entry->old_pid) 3224ff16c25SDavid Smith ); 3234ff16c25SDavid Smith 3244ff16c25SDavid Smith /* 325768d0c27SPeter Zijlstra * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE 326768d0c27SPeter Zijlstra * adding sched_stat support to SCHED_FIFO/RR would be welcome. 327768d0c27SPeter Zijlstra */ 328091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_stat_template, 329768d0c27SPeter Zijlstra 330768d0c27SPeter Zijlstra TP_PROTO(struct task_struct *tsk, u64 delay), 331768d0c27SPeter Zijlstra 33212473965SOleg Nesterov TP_ARGS(__perf_task(tsk), __perf_count(delay)), 333768d0c27SPeter Zijlstra 334768d0c27SPeter Zijlstra TP_STRUCT__entry( 335768d0c27SPeter Zijlstra __array( char, comm, TASK_COMM_LEN ) 336768d0c27SPeter Zijlstra __field( pid_t, pid ) 337768d0c27SPeter Zijlstra __field( u64, delay ) 338768d0c27SPeter Zijlstra ), 339768d0c27SPeter Zijlstra 340768d0c27SPeter Zijlstra TP_fast_assign( 341768d0c27SPeter Zijlstra memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 342768d0c27SPeter Zijlstra __entry->pid = tsk->pid; 343768d0c27SPeter Zijlstra __entry->delay = delay; 344768d0c27SPeter Zijlstra ), 345768d0c27SPeter Zijlstra 346434a83c3SIngo Molnar TP_printk("comm=%s pid=%d delay=%Lu [ns]", 347768d0c27SPeter Zijlstra __entry->comm, __entry->pid, 348768d0c27SPeter Zijlstra (unsigned long long)__entry->delay) 349768d0c27SPeter Zijlstra ); 350768d0c27SPeter Zijlstra 35175ec29abSSteven Rostedt 35275ec29abSSteven Rostedt /* 35375ec29abSSteven Rostedt * Tracepoint for accounting wait time (time the task is runnable 35475ec29abSSteven Rostedt * but not actually running due to scheduler contention). 35575ec29abSSteven Rostedt */ 35675ec29abSSteven Rostedt DEFINE_EVENT(sched_stat_template, sched_stat_wait, 35775ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 35875ec29abSSteven Rostedt TP_ARGS(tsk, delay)); 35975ec29abSSteven Rostedt 36075ec29abSSteven Rostedt /* 36175ec29abSSteven Rostedt * Tracepoint for accounting sleep time (time the task is not runnable, 36275ec29abSSteven Rostedt * including iowait, see below). 36375ec29abSSteven Rostedt */ 364470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_sleep, 36575ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 366470dda74SLi Zefan TP_ARGS(tsk, delay)); 36775ec29abSSteven Rostedt 36875ec29abSSteven Rostedt /* 36975ec29abSSteven Rostedt * Tracepoint for accounting iowait time (time the task is not runnable 37075ec29abSSteven Rostedt * due to waiting on IO to complete). 37175ec29abSSteven Rostedt */ 372470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_iowait, 37375ec29abSSteven Rostedt TP_PROTO(struct task_struct *tsk, u64 delay), 374470dda74SLi Zefan TP_ARGS(tsk, delay)); 37575ec29abSSteven Rostedt 376768d0c27SPeter Zijlstra /* 377b781a602SAndrew Vagin * Tracepoint for accounting blocked time (time the task is in uninterruptible). 378b781a602SAndrew Vagin */ 379b781a602SAndrew Vagin DEFINE_EVENT(sched_stat_template, sched_stat_blocked, 380b781a602SAndrew Vagin TP_PROTO(struct task_struct *tsk, u64 delay), 381b781a602SAndrew Vagin TP_ARGS(tsk, delay)); 382b781a602SAndrew Vagin 383b781a602SAndrew Vagin /* 384f977bb49SIngo Molnar * Tracepoint for accounting runtime (time the task is executing 385f977bb49SIngo Molnar * on a CPU). 386f977bb49SIngo Molnar */ 38736009d07SOleg Nesterov DECLARE_EVENT_CLASS(sched_stat_runtime, 388f977bb49SIngo Molnar 389f977bb49SIngo Molnar TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 390f977bb49SIngo Molnar 39112473965SOleg Nesterov TP_ARGS(tsk, __perf_count(runtime), vruntime), 392f977bb49SIngo Molnar 393f977bb49SIngo Molnar TP_STRUCT__entry( 394f977bb49SIngo Molnar __array( char, comm, TASK_COMM_LEN ) 395f977bb49SIngo Molnar __field( pid_t, pid ) 396f977bb49SIngo Molnar __field( u64, runtime ) 397f977bb49SIngo Molnar __field( u64, vruntime ) 398f977bb49SIngo Molnar ), 399f977bb49SIngo Molnar 400f977bb49SIngo Molnar TP_fast_assign( 401f977bb49SIngo Molnar memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 402f977bb49SIngo Molnar __entry->pid = tsk->pid; 403f977bb49SIngo Molnar __entry->runtime = runtime; 404f977bb49SIngo Molnar __entry->vruntime = vruntime; 405f977bb49SIngo Molnar ), 406f977bb49SIngo Molnar 407434a83c3SIngo Molnar TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]", 408f977bb49SIngo Molnar __entry->comm, __entry->pid, 409f977bb49SIngo Molnar (unsigned long long)__entry->runtime, 410f977bb49SIngo Molnar (unsigned long long)__entry->vruntime) 411f977bb49SIngo Molnar ); 412f977bb49SIngo Molnar 41336009d07SOleg Nesterov DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime, 41436009d07SOleg Nesterov TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime), 41536009d07SOleg Nesterov TP_ARGS(tsk, runtime, vruntime)); 41636009d07SOleg Nesterov 417a8027073SSteven Rostedt /* 418a8027073SSteven Rostedt * Tracepoint for showing priority inheritance modifying a tasks 419a8027073SSteven Rostedt * priority. 420a8027073SSteven Rostedt */ 421a8027073SSteven Rostedt TRACE_EVENT(sched_pi_setprio, 422a8027073SSteven Rostedt 423b91473ffSPeter Zijlstra TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task), 424a8027073SSteven Rostedt 425b91473ffSPeter Zijlstra TP_ARGS(tsk, pi_task), 426a8027073SSteven Rostedt 427a8027073SSteven Rostedt TP_STRUCT__entry( 428a8027073SSteven Rostedt __array( char, comm, TASK_COMM_LEN ) 429a8027073SSteven Rostedt __field( pid_t, pid ) 430a8027073SSteven Rostedt __field( int, oldprio ) 431a8027073SSteven Rostedt __field( int, newprio ) 432a8027073SSteven Rostedt ), 433a8027073SSteven Rostedt 434a8027073SSteven Rostedt TP_fast_assign( 435a8027073SSteven Rostedt memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 436a8027073SSteven Rostedt __entry->pid = tsk->pid; 437a8027073SSteven Rostedt __entry->oldprio = tsk->prio; 438b91473ffSPeter Zijlstra __entry->newprio = pi_task ? pi_task->prio : tsk->prio; 439b91473ffSPeter Zijlstra /* XXX SCHED_DEADLINE bits missing */ 440a8027073SSteven Rostedt ), 441a8027073SSteven Rostedt 442a8027073SSteven Rostedt TP_printk("comm=%s pid=%d oldprio=%d newprio=%d", 443a8027073SSteven Rostedt __entry->comm, __entry->pid, 444a8027073SSteven Rostedt __entry->oldprio, __entry->newprio) 445a8027073SSteven Rostedt ); 446a8027073SSteven Rostedt 4476a716c90SOleg Nesterov #ifdef CONFIG_DETECT_HUNG_TASK 4486a716c90SOleg Nesterov TRACE_EVENT(sched_process_hang, 4496a716c90SOleg Nesterov TP_PROTO(struct task_struct *tsk), 4506a716c90SOleg Nesterov TP_ARGS(tsk), 4516a716c90SOleg Nesterov 4526a716c90SOleg Nesterov TP_STRUCT__entry( 4536a716c90SOleg Nesterov __array( char, comm, TASK_COMM_LEN ) 4546a716c90SOleg Nesterov __field( pid_t, pid ) 4556a716c90SOleg Nesterov ), 4566a716c90SOleg Nesterov 4576a716c90SOleg Nesterov TP_fast_assign( 4586a716c90SOleg Nesterov memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); 4596a716c90SOleg Nesterov __entry->pid = tsk->pid; 4606a716c90SOleg Nesterov ), 4616a716c90SOleg Nesterov 4626a716c90SOleg Nesterov TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) 4636a716c90SOleg Nesterov ); 4646a716c90SOleg Nesterov #endif /* CONFIG_DETECT_HUNG_TASK */ 4656a716c90SOleg Nesterov 466286549dcSMel Gorman DECLARE_EVENT_CLASS(sched_move_task_template, 467286549dcSMel Gorman 468286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 469286549dcSMel Gorman 470286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu), 471286549dcSMel Gorman 472286549dcSMel Gorman TP_STRUCT__entry( 473286549dcSMel Gorman __field( pid_t, pid ) 474286549dcSMel Gorman __field( pid_t, tgid ) 475286549dcSMel Gorman __field( pid_t, ngid ) 476286549dcSMel Gorman __field( int, src_cpu ) 477286549dcSMel Gorman __field( int, src_nid ) 478286549dcSMel Gorman __field( int, dst_cpu ) 479286549dcSMel Gorman __field( int, dst_nid ) 480286549dcSMel Gorman ), 481286549dcSMel Gorman 482286549dcSMel Gorman TP_fast_assign( 483286549dcSMel Gorman __entry->pid = task_pid_nr(tsk); 484286549dcSMel Gorman __entry->tgid = task_tgid_nr(tsk); 485286549dcSMel Gorman __entry->ngid = task_numa_group_id(tsk); 486286549dcSMel Gorman __entry->src_cpu = src_cpu; 487286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 488286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 489286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 490286549dcSMel Gorman ), 491286549dcSMel Gorman 492286549dcSMel Gorman TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d", 493286549dcSMel Gorman __entry->pid, __entry->tgid, __entry->ngid, 494286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 495286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 496286549dcSMel Gorman ); 497286549dcSMel Gorman 498286549dcSMel Gorman /* 499286549dcSMel Gorman * Tracks migration of tasks from one runqueue to another. Can be used to 500286549dcSMel Gorman * detect if automatic NUMA balancing is bouncing between nodes 501286549dcSMel Gorman */ 502286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_move_numa, 503286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 504286549dcSMel Gorman 505286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 506286549dcSMel Gorman ); 507286549dcSMel Gorman 508286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_stick_numa, 509286549dcSMel Gorman TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), 510286549dcSMel Gorman 511286549dcSMel Gorman TP_ARGS(tsk, src_cpu, dst_cpu) 512286549dcSMel Gorman ); 513286549dcSMel Gorman 514286549dcSMel Gorman TRACE_EVENT(sched_swap_numa, 515286549dcSMel Gorman 516286549dcSMel Gorman TP_PROTO(struct task_struct *src_tsk, int src_cpu, 517286549dcSMel Gorman struct task_struct *dst_tsk, int dst_cpu), 518286549dcSMel Gorman 519286549dcSMel Gorman TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu), 520286549dcSMel Gorman 521286549dcSMel Gorman TP_STRUCT__entry( 522286549dcSMel Gorman __field( pid_t, src_pid ) 523286549dcSMel Gorman __field( pid_t, src_tgid ) 524286549dcSMel Gorman __field( pid_t, src_ngid ) 525286549dcSMel Gorman __field( int, src_cpu ) 526286549dcSMel Gorman __field( int, src_nid ) 527286549dcSMel Gorman __field( pid_t, dst_pid ) 528286549dcSMel Gorman __field( pid_t, dst_tgid ) 529286549dcSMel Gorman __field( pid_t, dst_ngid ) 530286549dcSMel Gorman __field( int, dst_cpu ) 531286549dcSMel Gorman __field( int, dst_nid ) 532286549dcSMel Gorman ), 533286549dcSMel Gorman 534286549dcSMel Gorman TP_fast_assign( 535286549dcSMel Gorman __entry->src_pid = task_pid_nr(src_tsk); 536286549dcSMel Gorman __entry->src_tgid = task_tgid_nr(src_tsk); 537286549dcSMel Gorman __entry->src_ngid = task_numa_group_id(src_tsk); 538286549dcSMel Gorman __entry->src_cpu = src_cpu; 539286549dcSMel Gorman __entry->src_nid = cpu_to_node(src_cpu); 540286549dcSMel Gorman __entry->dst_pid = task_pid_nr(dst_tsk); 541286549dcSMel Gorman __entry->dst_tgid = task_tgid_nr(dst_tsk); 542286549dcSMel Gorman __entry->dst_ngid = task_numa_group_id(dst_tsk); 543286549dcSMel Gorman __entry->dst_cpu = dst_cpu; 544286549dcSMel Gorman __entry->dst_nid = cpu_to_node(dst_cpu); 545286549dcSMel Gorman ), 546286549dcSMel Gorman 547286549dcSMel 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", 548286549dcSMel Gorman __entry->src_pid, __entry->src_tgid, __entry->src_ngid, 549286549dcSMel Gorman __entry->src_cpu, __entry->src_nid, 550286549dcSMel Gorman __entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid, 551286549dcSMel Gorman __entry->dst_cpu, __entry->dst_nid) 552286549dcSMel Gorman ); 553dfc68f29SAndy Lutomirski 554dfc68f29SAndy Lutomirski /* 555dfc68f29SAndy Lutomirski * Tracepoint for waking a polling cpu without an IPI. 556dfc68f29SAndy Lutomirski */ 557dfc68f29SAndy Lutomirski TRACE_EVENT(sched_wake_idle_without_ipi, 558dfc68f29SAndy Lutomirski 559dfc68f29SAndy Lutomirski TP_PROTO(int cpu), 560dfc68f29SAndy Lutomirski 561dfc68f29SAndy Lutomirski TP_ARGS(cpu), 562dfc68f29SAndy Lutomirski 563dfc68f29SAndy Lutomirski TP_STRUCT__entry( 564dfc68f29SAndy Lutomirski __field( int, cpu ) 565dfc68f29SAndy Lutomirski ), 566dfc68f29SAndy Lutomirski 567dfc68f29SAndy Lutomirski TP_fast_assign( 568dfc68f29SAndy Lutomirski __entry->cpu = cpu; 569dfc68f29SAndy Lutomirski ), 570dfc68f29SAndy Lutomirski 571dfc68f29SAndy Lutomirski TP_printk("cpu=%d", __entry->cpu) 572dfc68f29SAndy Lutomirski ); 573ad8d75ffSSteven Rostedt #endif /* _TRACE_SCHED_H */ 574ad8d75ffSSteven Rostedt 575ad8d75ffSSteven Rostedt /* This part must be outside protection */ 576ad8d75ffSSteven Rostedt #include <trace/define_trace.h> 577