linux/include/trace/events/sched.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#undef TRACE_SYSTEM
   3#define TRACE_SYSTEM sched
   4
   5#if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
   6#define _TRACE_SCHED_H
   7
   8#include <linux/kthread.h>
   9#include <linux/sched/numa_balancing.h>
  10#include <linux/tracepoint.h>
  11#include <linux/binfmts.h>
  12
  13/*
  14 * Tracepoint for calling kthread_stop, performed to end a kthread:
  15 */
  16TRACE_EVENT(sched_kthread_stop,
  17
  18        TP_PROTO(struct task_struct *t),
  19
  20        TP_ARGS(t),
  21
  22        TP_STRUCT__entry(
  23                __array(        char,   comm,   TASK_COMM_LEN   )
  24                __field(        pid_t,  pid                     )
  25        ),
  26
  27        TP_fast_assign(
  28                memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
  29                __entry->pid    = t->pid;
  30        ),
  31
  32        TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
  33);
  34
  35/*
  36 * Tracepoint for the return value of the kthread stopping:
  37 */
  38TRACE_EVENT(sched_kthread_stop_ret,
  39
  40        TP_PROTO(int ret),
  41
  42        TP_ARGS(ret),
  43
  44        TP_STRUCT__entry(
  45                __field(        int,    ret     )
  46        ),
  47
  48        TP_fast_assign(
  49                __entry->ret    = ret;
  50        ),
  51
  52        TP_printk("ret=%d", __entry->ret)
  53);
  54
  55/**
  56 * sched_kthread_work_queue_work - called when a work gets queued
  57 * @worker:     pointer to the kthread_worker
  58 * @work:       pointer to struct kthread_work
  59 *
  60 * This event occurs when a work is queued immediately or once a
  61 * delayed work is actually queued (ie: once the delay has been
  62 * reached).
  63 */
  64TRACE_EVENT(sched_kthread_work_queue_work,
  65
  66        TP_PROTO(struct kthread_worker *worker,
  67                 struct kthread_work *work),
  68
  69        TP_ARGS(worker, work),
  70
  71        TP_STRUCT__entry(
  72                __field( void *,        work    )
  73                __field( void *,        function)
  74                __field( void *,        worker)
  75        ),
  76
  77        TP_fast_assign(
  78                __entry->work           = work;
  79                __entry->function       = work->func;
  80                __entry->worker         = worker;
  81        ),
  82
  83        TP_printk("work struct=%p function=%ps worker=%p",
  84                  __entry->work, __entry->function, __entry->worker)
  85);
  86
  87/**
  88 * sched_kthread_work_execute_start - called immediately before the work callback
  89 * @work:       pointer to struct kthread_work
  90 *
  91 * Allows to track kthread work execution.
  92 */
  93TRACE_EVENT(sched_kthread_work_execute_start,
  94
  95        TP_PROTO(struct kthread_work *work),
  96
  97        TP_ARGS(work),
  98
  99        TP_STRUCT__entry(
 100                __field( void *,        work    )
 101                __field( void *,        function)
 102        ),
 103
 104        TP_fast_assign(
 105                __entry->work           = work;
 106                __entry->function       = work->func;
 107        ),
 108
 109        TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
 110);
 111
 112/**
 113 * sched_kthread_work_execute_end - called immediately after the work callback
 114 * @work:       pointer to struct work_struct
 115 * @function:   pointer to worker function
 116 *
 117 * Allows to track workqueue execution.
 118 */
 119TRACE_EVENT(sched_kthread_work_execute_end,
 120
 121        TP_PROTO(struct kthread_work *work, kthread_work_func_t function),
 122
 123        TP_ARGS(work, function),
 124
 125        TP_STRUCT__entry(
 126                __field( void *,        work    )
 127                __field( void *,        function)
 128        ),
 129
 130        TP_fast_assign(
 131                __entry->work           = work;
 132                __entry->function       = function;
 133        ),
 134
 135        TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
 136);
 137
 138/*
 139 * Tracepoint for waking up a task:
 140 */
 141DECLARE_EVENT_CLASS(sched_wakeup_template,
 142
 143        TP_PROTO(struct task_struct *p),
 144
 145        TP_ARGS(__perf_task(p)),
 146
 147        TP_STRUCT__entry(
 148                __array(        char,   comm,   TASK_COMM_LEN   )
 149                __field(        pid_t,  pid                     )
 150                __field(        int,    prio                    )
 151                __field(        int,    target_cpu              )
 152        ),
 153
 154        TP_fast_assign(
 155                memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
 156                __entry->pid            = p->pid;
 157                __entry->prio           = p->prio; /* XXX SCHED_DEADLINE */
 158                __entry->target_cpu     = task_cpu(p);
 159        ),
 160
 161        TP_printk("comm=%s pid=%d prio=%d target_cpu=%03d",
 162                  __entry->comm, __entry->pid, __entry->prio,
 163                  __entry->target_cpu)
 164);
 165
 166/*
 167 * Tracepoint called when waking a task; this tracepoint is guaranteed to be
 168 * called from the waking context.
 169 */
 170DEFINE_EVENT(sched_wakeup_template, sched_waking,
 171             TP_PROTO(struct task_struct *p),
 172             TP_ARGS(p));
 173
 174/*
 175 * Tracepoint called when the task is actually woken; p->state == TASK_RUNNING.
 176 * It is not always called from the waking context.
 177 */
 178DEFINE_EVENT(sched_wakeup_template, sched_wakeup,
 179             TP_PROTO(struct task_struct *p),
 180             TP_ARGS(p));
 181
 182/*
 183 * Tracepoint for waking up a new task:
 184 */
 185DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new,
 186             TP_PROTO(struct task_struct *p),
 187             TP_ARGS(p));
 188
 189#ifdef CREATE_TRACE_POINTS
 190static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p)
 191{
 192        unsigned int state;
 193
 194#ifdef CONFIG_SCHED_DEBUG
 195        BUG_ON(p != current);
 196#endif /* CONFIG_SCHED_DEBUG */
 197
 198        /*
 199         * Preemption ignores task state, therefore preempted tasks are always
 200         * RUNNING (we will not have dequeued if state != RUNNING).
 201         */
 202        if (preempt)
 203                return TASK_REPORT_MAX;
 204
 205        /*
 206         * task_state_index() uses fls() and returns a value from 0-8 range.
 207         * Decrement it by 1 (except TASK_RUNNING state i.e 0) before using
 208         * it for left shift operation to get the correct task->state
 209         * mapping.
 210         */
 211        state = task_state_index(p);
 212
 213        return state ? (1 << (state - 1)) : state;
 214}
 215#endif /* CREATE_TRACE_POINTS */
 216
 217/*
 218 * Tracepoint for task switches, performed by the scheduler:
 219 */
 220TRACE_EVENT(sched_switch,
 221
 222        TP_PROTO(bool preempt,
 223                 struct task_struct *prev,
 224                 struct task_struct *next),
 225
 226        TP_ARGS(preempt, prev, next),
 227
 228        TP_STRUCT__entry(
 229                __array(        char,   prev_comm,      TASK_COMM_LEN   )
 230                __field(        pid_t,  prev_pid                        )
 231                __field(        int,    prev_prio                       )
 232                __field(        long,   prev_state                      )
 233                __array(        char,   next_comm,      TASK_COMM_LEN   )
 234                __field(        pid_t,  next_pid                        )
 235                __field(        int,    next_prio                       )
 236        ),
 237
 238        TP_fast_assign(
 239                memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
 240                __entry->prev_pid       = prev->pid;
 241                __entry->prev_prio      = prev->prio;
 242                __entry->prev_state     = __trace_sched_switch_state(preempt, prev);
 243                memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
 244                __entry->next_pid       = next->pid;
 245                __entry->next_prio      = next->prio;
 246                /* XXX SCHED_DEADLINE */
 247        ),
 248
 249        TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d",
 250                __entry->prev_comm, __entry->prev_pid, __entry->prev_prio,
 251
 252                (__entry->prev_state & (TASK_REPORT_MAX - 1)) ?
 253                  __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|",
 254                                { TASK_INTERRUPTIBLE, "S" },
 255                                { TASK_UNINTERRUPTIBLE, "D" },
 256                                { __TASK_STOPPED, "T" },
 257                                { __TASK_TRACED, "t" },
 258                                { EXIT_DEAD, "X" },
 259                                { EXIT_ZOMBIE, "Z" },
 260                                { TASK_PARKED, "P" },
 261                                { TASK_DEAD, "I" }) :
 262                  "R",
 263
 264                __entry->prev_state & TASK_REPORT_MAX ? "+" : "",
 265                __entry->next_comm, __entry->next_pid, __entry->next_prio)
 266);
 267
 268/*
 269 * Tracepoint for a task being migrated:
 270 */
 271TRACE_EVENT(sched_migrate_task,
 272
 273        TP_PROTO(struct task_struct *p, int dest_cpu),
 274
 275        TP_ARGS(p, dest_cpu),
 276
 277        TP_STRUCT__entry(
 278                __array(        char,   comm,   TASK_COMM_LEN   )
 279                __field(        pid_t,  pid                     )
 280                __field(        int,    prio                    )
 281                __field(        int,    orig_cpu                )
 282                __field(        int,    dest_cpu                )
 283        ),
 284
 285        TP_fast_assign(
 286                memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
 287                __entry->pid            = p->pid;
 288                __entry->prio           = p->prio; /* XXX SCHED_DEADLINE */
 289                __entry->orig_cpu       = task_cpu(p);
 290                __entry->dest_cpu       = dest_cpu;
 291        ),
 292
 293        TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d",
 294                  __entry->comm, __entry->pid, __entry->prio,
 295                  __entry->orig_cpu, __entry->dest_cpu)
 296);
 297
 298DECLARE_EVENT_CLASS(sched_process_template,
 299
 300        TP_PROTO(struct task_struct *p),
 301
 302        TP_ARGS(p),
 303
 304        TP_STRUCT__entry(
 305                __array(        char,   comm,   TASK_COMM_LEN   )
 306                __field(        pid_t,  pid                     )
 307                __field(        int,    prio                    )
 308        ),
 309
 310        TP_fast_assign(
 311                memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
 312                __entry->pid            = p->pid;
 313                __entry->prio           = p->prio; /* XXX SCHED_DEADLINE */
 314        ),
 315
 316        TP_printk("comm=%s pid=%d prio=%d",
 317                  __entry->comm, __entry->pid, __entry->prio)
 318);
 319
 320/*
 321 * Tracepoint for freeing a task:
 322 */
 323DEFINE_EVENT(sched_process_template, sched_process_free,
 324             TP_PROTO(struct task_struct *p),
 325             TP_ARGS(p));
 326
 327/*
 328 * Tracepoint for a task exiting:
 329 */
 330DEFINE_EVENT(sched_process_template, sched_process_exit,
 331             TP_PROTO(struct task_struct *p),
 332             TP_ARGS(p));
 333
 334/*
 335 * Tracepoint for waiting on task to unschedule:
 336 */
 337DEFINE_EVENT(sched_process_template, sched_wait_task,
 338        TP_PROTO(struct task_struct *p),
 339        TP_ARGS(p));
 340
 341/*
 342 * Tracepoint for a waiting task:
 343 */
 344TRACE_EVENT(sched_process_wait,
 345
 346        TP_PROTO(struct pid *pid),
 347
 348        TP_ARGS(pid),
 349
 350        TP_STRUCT__entry(
 351                __array(        char,   comm,   TASK_COMM_LEN   )
 352                __field(        pid_t,  pid                     )
 353                __field(        int,    prio                    )
 354        ),
 355
 356        TP_fast_assign(
 357                memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
 358                __entry->pid            = pid_nr(pid);
 359                __entry->prio           = current->prio; /* XXX SCHED_DEADLINE */
 360        ),
 361
 362        TP_printk("comm=%s pid=%d prio=%d",
 363                  __entry->comm, __entry->pid, __entry->prio)
 364);
 365
 366/*
 367 * Tracepoint for kernel_clone:
 368 */
 369TRACE_EVENT(sched_process_fork,
 370
 371        TP_PROTO(struct task_struct *parent, struct task_struct *child),
 372
 373        TP_ARGS(parent, child),
 374
 375        TP_STRUCT__entry(
 376                __array(        char,   parent_comm,    TASK_COMM_LEN   )
 377                __field(        pid_t,  parent_pid                      )
 378                __array(        char,   child_comm,     TASK_COMM_LEN   )
 379                __field(        pid_t,  child_pid                       )
 380        ),
 381
 382        TP_fast_assign(
 383                memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN);
 384                __entry->parent_pid     = parent->pid;
 385                memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN);
 386                __entry->child_pid      = child->pid;
 387        ),
 388
 389        TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d",
 390                __entry->parent_comm, __entry->parent_pid,
 391                __entry->child_comm, __entry->child_pid)
 392);
 393
 394/*
 395 * Tracepoint for exec:
 396 */
 397TRACE_EVENT(sched_process_exec,
 398
 399        TP_PROTO(struct task_struct *p, pid_t old_pid,
 400                 struct linux_binprm *bprm),
 401
 402        TP_ARGS(p, old_pid, bprm),
 403
 404        TP_STRUCT__entry(
 405                __string(       filename,       bprm->filename  )
 406                __field(        pid_t,          pid             )
 407                __field(        pid_t,          old_pid         )
 408        ),
 409
 410        TP_fast_assign(
 411                __assign_str(filename, bprm->filename);
 412                __entry->pid            = p->pid;
 413                __entry->old_pid        = old_pid;
 414        ),
 415
 416        TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename),
 417                  __entry->pid, __entry->old_pid)
 418);
 419
 420
 421#ifdef CONFIG_SCHEDSTATS
 422#define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT
 423#define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS
 424#else
 425#define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT_NOP
 426#define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS_NOP
 427#endif
 428
 429/*
 430 * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
 431 *     adding sched_stat support to SCHED_FIFO/RR would be welcome.
 432 */
 433DECLARE_EVENT_CLASS_SCHEDSTAT(sched_stat_template,
 434
 435        TP_PROTO(struct task_struct *tsk, u64 delay),
 436
 437        TP_ARGS(__perf_task(tsk), __perf_count(delay)),
 438
 439        TP_STRUCT__entry(
 440                __array( char,  comm,   TASK_COMM_LEN   )
 441                __field( pid_t, pid                     )
 442                __field( u64,   delay                   )
 443        ),
 444
 445        TP_fast_assign(
 446                memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
 447                __entry->pid    = tsk->pid;
 448                __entry->delay  = delay;
 449        ),
 450
 451        TP_printk("comm=%s pid=%d delay=%Lu [ns]",
 452                        __entry->comm, __entry->pid,
 453                        (unsigned long long)__entry->delay)
 454);
 455
 456/*
 457 * Tracepoint for accounting wait time (time the task is runnable
 458 * but not actually running due to scheduler contention).
 459 */
 460DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_wait,
 461             TP_PROTO(struct task_struct *tsk, u64 delay),
 462             TP_ARGS(tsk, delay));
 463
 464/*
 465 * Tracepoint for accounting sleep time (time the task is not runnable,
 466 * including iowait, see below).
 467 */
 468DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_sleep,
 469             TP_PROTO(struct task_struct *tsk, u64 delay),
 470             TP_ARGS(tsk, delay));
 471
 472/*
 473 * Tracepoint for accounting iowait time (time the task is not runnable
 474 * due to waiting on IO to complete).
 475 */
 476DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_iowait,
 477             TP_PROTO(struct task_struct *tsk, u64 delay),
 478             TP_ARGS(tsk, delay));
 479
 480/*
 481 * Tracepoint for accounting blocked time (time the task is in uninterruptible).
 482 */
 483DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_blocked,
 484             TP_PROTO(struct task_struct *tsk, u64 delay),
 485             TP_ARGS(tsk, delay));
 486
 487/*
 488 * Tracepoint for accounting runtime (time the task is executing
 489 * on a CPU).
 490 */
 491DECLARE_EVENT_CLASS(sched_stat_runtime,
 492
 493        TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
 494
 495        TP_ARGS(tsk, __perf_count(runtime), vruntime),
 496
 497        TP_STRUCT__entry(
 498                __array( char,  comm,   TASK_COMM_LEN   )
 499                __field( pid_t, pid                     )
 500                __field( u64,   runtime                 )
 501                __field( u64,   vruntime                        )
 502        ),
 503
 504        TP_fast_assign(
 505                memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
 506                __entry->pid            = tsk->pid;
 507                __entry->runtime        = runtime;
 508                __entry->vruntime       = vruntime;
 509        ),
 510
 511        TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
 512                        __entry->comm, __entry->pid,
 513                        (unsigned long long)__entry->runtime,
 514                        (unsigned long long)__entry->vruntime)
 515);
 516
 517DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime,
 518             TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
 519             TP_ARGS(tsk, runtime, vruntime));
 520
 521/*
 522 * Tracepoint for showing priority inheritance modifying a tasks
 523 * priority.
 524 */
 525TRACE_EVENT(sched_pi_setprio,
 526
 527        TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task),
 528
 529        TP_ARGS(tsk, pi_task),
 530
 531        TP_STRUCT__entry(
 532                __array( char,  comm,   TASK_COMM_LEN   )
 533                __field( pid_t, pid                     )
 534                __field( int,   oldprio                 )
 535                __field( int,   newprio                 )
 536        ),
 537
 538        TP_fast_assign(
 539                memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
 540                __entry->pid            = tsk->pid;
 541                __entry->oldprio        = tsk->prio;
 542                __entry->newprio        = pi_task ?
 543                                min(tsk->normal_prio, pi_task->prio) :
 544                                tsk->normal_prio;
 545                /* XXX SCHED_DEADLINE bits missing */
 546        ),
 547
 548        TP_printk("comm=%s pid=%d oldprio=%d newprio=%d",
 549                        __entry->comm, __entry->pid,
 550                        __entry->oldprio, __entry->newprio)
 551);
 552
 553#ifdef CONFIG_DETECT_HUNG_TASK
 554TRACE_EVENT(sched_process_hang,
 555        TP_PROTO(struct task_struct *tsk),
 556        TP_ARGS(tsk),
 557
 558        TP_STRUCT__entry(
 559                __array( char,  comm,   TASK_COMM_LEN   )
 560                __field( pid_t, pid                     )
 561        ),
 562
 563        TP_fast_assign(
 564                memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
 565                __entry->pid = tsk->pid;
 566        ),
 567
 568        TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
 569);
 570#endif /* CONFIG_DETECT_HUNG_TASK */
 571
 572/*
 573 * Tracks migration of tasks from one runqueue to another. Can be used to
 574 * detect if automatic NUMA balancing is bouncing between nodes.
 575 */
 576TRACE_EVENT(sched_move_numa,
 577
 578        TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
 579
 580        TP_ARGS(tsk, src_cpu, dst_cpu),
 581
 582        TP_STRUCT__entry(
 583                __field( pid_t, pid                     )
 584                __field( pid_t, tgid                    )
 585                __field( pid_t, ngid                    )
 586                __field( int,   src_cpu                 )
 587                __field( int,   src_nid                 )
 588                __field( int,   dst_cpu                 )
 589                __field( int,   dst_nid                 )
 590        ),
 591
 592        TP_fast_assign(
 593                __entry->pid            = task_pid_nr(tsk);
 594                __entry->tgid           = task_tgid_nr(tsk);
 595                __entry->ngid           = task_numa_group_id(tsk);
 596                __entry->src_cpu        = src_cpu;
 597                __entry->src_nid        = cpu_to_node(src_cpu);
 598                __entry->dst_cpu        = dst_cpu;
 599                __entry->dst_nid        = cpu_to_node(dst_cpu);
 600        ),
 601
 602        TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d",
 603                        __entry->pid, __entry->tgid, __entry->ngid,
 604                        __entry->src_cpu, __entry->src_nid,
 605                        __entry->dst_cpu, __entry->dst_nid)
 606);
 607
 608DECLARE_EVENT_CLASS(sched_numa_pair_template,
 609
 610        TP_PROTO(struct task_struct *src_tsk, int src_cpu,
 611                 struct task_struct *dst_tsk, int dst_cpu),
 612
 613        TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu),
 614
 615        TP_STRUCT__entry(
 616                __field( pid_t, src_pid                 )
 617                __field( pid_t, src_tgid                )
 618                __field( pid_t, src_ngid                )
 619                __field( int,   src_cpu                 )
 620                __field( int,   src_nid                 )
 621                __field( pid_t, dst_pid                 )
 622                __field( pid_t, dst_tgid                )
 623                __field( pid_t, dst_ngid                )
 624                __field( int,   dst_cpu                 )
 625                __field( int,   dst_nid                 )
 626        ),
 627
 628        TP_fast_assign(
 629                __entry->src_pid        = task_pid_nr(src_tsk);
 630                __entry->src_tgid       = task_tgid_nr(src_tsk);
 631                __entry->src_ngid       = task_numa_group_id(src_tsk);
 632                __entry->src_cpu        = src_cpu;
 633                __entry->src_nid        = cpu_to_node(src_cpu);
 634                __entry->dst_pid        = dst_tsk ? task_pid_nr(dst_tsk) : 0;
 635                __entry->dst_tgid       = dst_tsk ? task_tgid_nr(dst_tsk) : 0;
 636                __entry->dst_ngid       = dst_tsk ? task_numa_group_id(dst_tsk) : 0;
 637                __entry->dst_cpu        = dst_cpu;
 638                __entry->dst_nid        = dst_cpu >= 0 ? cpu_to_node(dst_cpu) : -1;
 639        ),
 640
 641        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",
 642                        __entry->src_pid, __entry->src_tgid, __entry->src_ngid,
 643                        __entry->src_cpu, __entry->src_nid,
 644                        __entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid,
 645                        __entry->dst_cpu, __entry->dst_nid)
 646);
 647
 648DEFINE_EVENT(sched_numa_pair_template, sched_stick_numa,
 649
 650        TP_PROTO(struct task_struct *src_tsk, int src_cpu,
 651                 struct task_struct *dst_tsk, int dst_cpu),
 652
 653        TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
 654);
 655
 656DEFINE_EVENT(sched_numa_pair_template, sched_swap_numa,
 657
 658        TP_PROTO(struct task_struct *src_tsk, int src_cpu,
 659                 struct task_struct *dst_tsk, int dst_cpu),
 660
 661        TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
 662);
 663
 664
 665/*
 666 * Tracepoint for waking a polling cpu without an IPI.
 667 */
 668TRACE_EVENT(sched_wake_idle_without_ipi,
 669
 670        TP_PROTO(int cpu),
 671
 672        TP_ARGS(cpu),
 673
 674        TP_STRUCT__entry(
 675                __field(        int,    cpu     )
 676        ),
 677
 678        TP_fast_assign(
 679                __entry->cpu    = cpu;
 680        ),
 681
 682        TP_printk("cpu=%d", __entry->cpu)
 683);
 684
 685/*
 686 * Following tracepoints are not exported in tracefs and provide hooking
 687 * mechanisms only for testing and debugging purposes.
 688 *
 689 * Postfixed with _tp to make them easily identifiable in the code.
 690 */
 691DECLARE_TRACE(pelt_cfs_tp,
 692        TP_PROTO(struct cfs_rq *cfs_rq),
 693        TP_ARGS(cfs_rq));
 694
 695DECLARE_TRACE(pelt_rt_tp,
 696        TP_PROTO(struct rq *rq),
 697        TP_ARGS(rq));
 698
 699DECLARE_TRACE(pelt_dl_tp,
 700        TP_PROTO(struct rq *rq),
 701        TP_ARGS(rq));
 702
 703DECLARE_TRACE(pelt_thermal_tp,
 704        TP_PROTO(struct rq *rq),
 705        TP_ARGS(rq));
 706
 707DECLARE_TRACE(pelt_irq_tp,
 708        TP_PROTO(struct rq *rq),
 709        TP_ARGS(rq));
 710
 711DECLARE_TRACE(pelt_se_tp,
 712        TP_PROTO(struct sched_entity *se),
 713        TP_ARGS(se));
 714
 715DECLARE_TRACE(sched_cpu_capacity_tp,
 716        TP_PROTO(struct rq *rq),
 717        TP_ARGS(rq));
 718
 719DECLARE_TRACE(sched_overutilized_tp,
 720        TP_PROTO(struct root_domain *rd, bool overutilized),
 721        TP_ARGS(rd, overutilized));
 722
 723DECLARE_TRACE(sched_util_est_cfs_tp,
 724        TP_PROTO(struct cfs_rq *cfs_rq),
 725        TP_ARGS(cfs_rq));
 726
 727DECLARE_TRACE(sched_util_est_se_tp,
 728        TP_PROTO(struct sched_entity *se),
 729        TP_ARGS(se));
 730
 731DECLARE_TRACE(sched_update_nr_running_tp,
 732        TP_PROTO(struct rq *rq, int change),
 733        TP_ARGS(rq, change));
 734
 735#endif /* _TRACE_SCHED_H */
 736
 737/* This part must be outside protection */
 738#include <trace/define_trace.h>
 739