~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/trace/events/sched.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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  */
 16 TRACE_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  */
 38 TRACE_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  */
 64 TRACE_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  */
 93 TRACE_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  */
119 TRACE_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  */
141 DECLARE_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  */
170 DEFINE_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  */
178 DEFINE_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  */
185 DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new,
186              TP_PROTO(struct task_struct *p),
187              TP_ARGS(p));
188 
189 #ifdef CREATE_TRACE_POINTS
190 static inline long __trace_sched_switch_state(bool preempt,
191                                               unsigned int prev_state,
192                                               struct task_struct *p)
193 {
194         unsigned int state;
195 
196 #ifdef CONFIG_SCHED_DEBUG
197         BUG_ON(p != current);
198 #endif /* CONFIG_SCHED_DEBUG */
199 
200         /*
201          * Preemption ignores task state, therefore preempted tasks are always
202          * RUNNING (we will not have dequeued if state != RUNNING).
203          */
204         if (preempt)
205                 return TASK_REPORT_MAX;
206 
207         /*
208          * task_state_index() uses fls() and returns a value from 0-8 range.
209          * Decrement it by 1 (except TASK_RUNNING state i.e 0) before using
210          * it for left shift operation to get the correct task->state
211          * mapping.
212          */
213         state = __task_state_index(prev_state, p->exit_state);
214 
215         return state ? (1 << (state - 1)) : state;
216 }
217 #endif /* CREATE_TRACE_POINTS */
218 
219 /*
220  * Tracepoint for task switches, performed by the scheduler:
221  */
222 TRACE_EVENT(sched_switch,
223 
224         TP_PROTO(bool preempt,
225                  struct task_struct *prev,
226                  struct task_struct *next,
227                  unsigned int prev_state),
228 
229         TP_ARGS(preempt, prev, next, prev_state),
230 
231         TP_STRUCT__entry(
232                 __array(        char,   prev_comm,      TASK_COMM_LEN   )
233                 __field(        pid_t,  prev_pid                        )
234                 __field(        int,    prev_prio                       )
235                 __field(        long,   prev_state                      )
236                 __array(        char,   next_comm,      TASK_COMM_LEN   )
237                 __field(        pid_t,  next_pid                        )
238                 __field(        int,    next_prio                       )
239         ),
240 
241         TP_fast_assign(
242                 memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
243                 __entry->prev_pid       = prev->pid;
244                 __entry->prev_prio      = prev->prio;
245                 __entry->prev_state     = __trace_sched_switch_state(preempt, prev_state, prev);
246                 memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
247                 __entry->next_pid       = next->pid;
248                 __entry->next_prio      = next->prio;
249                 /* XXX SCHED_DEADLINE */
250         ),
251 
252         TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d",
253                 __entry->prev_comm, __entry->prev_pid, __entry->prev_prio,
254 
255                 (__entry->prev_state & (TASK_REPORT_MAX - 1)) ?
256                   __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|",
257                                 { TASK_INTERRUPTIBLE, "S" },
258                                 { TASK_UNINTERRUPTIBLE, "D" },
259                                 { __TASK_STOPPED, "T" },
260                                 { __TASK_TRACED, "t" },
261                                 { EXIT_DEAD, "X" },
262                                 { EXIT_ZOMBIE, "Z" },
263                                 { TASK_PARKED, "P" },
264                                 { TASK_DEAD, "I" }) :
265                   "R",
266 
267                 __entry->prev_state & TASK_REPORT_MAX ? "+" : "",
268                 __entry->next_comm, __entry->next_pid, __entry->next_prio)
269 );
270 
271 /*
272  * Tracepoint for a task being migrated:
273  */
274 TRACE_EVENT(sched_migrate_task,
275 
276         TP_PROTO(struct task_struct *p, int dest_cpu),
277 
278         TP_ARGS(p, dest_cpu),
279 
280         TP_STRUCT__entry(
281                 __array(        char,   comm,   TASK_COMM_LEN   )
282                 __field(        pid_t,  pid                     )
283                 __field(        int,    prio                    )
284                 __field(        int,    orig_cpu                )
285                 __field(        int,    dest_cpu                )
286         ),
287 
288         TP_fast_assign(
289                 memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
290                 __entry->pid            = p->pid;
291                 __entry->prio           = p->prio; /* XXX SCHED_DEADLINE */
292                 __entry->orig_cpu       = task_cpu(p);
293                 __entry->dest_cpu       = dest_cpu;
294         ),
295 
296         TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d",
297                   __entry->comm, __entry->pid, __entry->prio,
298                   __entry->orig_cpu, __entry->dest_cpu)
299 );
300 
301 DECLARE_EVENT_CLASS(sched_process_template,
302 
303         TP_PROTO(struct task_struct *p),
304 
305         TP_ARGS(p),
306 
307         TP_STRUCT__entry(
308                 __array(        char,   comm,   TASK_COMM_LEN   )
309                 __field(        pid_t,  pid                     )
310                 __field(        int,    prio                    )
311         ),
312 
313         TP_fast_assign(
314                 memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
315                 __entry->pid            = p->pid;
316                 __entry->prio           = p->prio; /* XXX SCHED_DEADLINE */
317         ),
318 
319         TP_printk("comm=%s pid=%d prio=%d",
320                   __entry->comm, __entry->pid, __entry->prio)
321 );
322 
323 /*
324  * Tracepoint for freeing a task:
325  */
326 DEFINE_EVENT(sched_process_template, sched_process_free,
327              TP_PROTO(struct task_struct *p),
328              TP_ARGS(p));
329 
330 /*
331  * Tracepoint for a task exiting:
332  */
333 DEFINE_EVENT(sched_process_template, sched_process_exit,
334              TP_PROTO(struct task_struct *p),
335              TP_ARGS(p));
336 
337 /*
338  * Tracepoint for waiting on task to unschedule:
339  */
340 DEFINE_EVENT(sched_process_template, sched_wait_task,
341         TP_PROTO(struct task_struct *p),
342         TP_ARGS(p));
343 
344 /*
345  * Tracepoint for a waiting task:
346  */
347 TRACE_EVENT(sched_process_wait,
348 
349         TP_PROTO(struct pid *pid),
350 
351         TP_ARGS(pid),
352 
353         TP_STRUCT__entry(
354                 __array(        char,   comm,   TASK_COMM_LEN   )
355                 __field(        pid_t,  pid                     )
356                 __field(        int,    prio                    )
357         ),
358 
359         TP_fast_assign(
360                 memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
361                 __entry->pid            = pid_nr(pid);
362                 __entry->prio           = current->prio; /* XXX SCHED_DEADLINE */
363         ),
364 
365         TP_printk("comm=%s pid=%d prio=%d",
366                   __entry->comm, __entry->pid, __entry->prio)
367 );
368 
369 /*
370  * Tracepoint for kernel_clone:
371  */
372 TRACE_EVENT(sched_process_fork,
373 
374         TP_PROTO(struct task_struct *parent, struct task_struct *child),
375 
376         TP_ARGS(parent, child),
377 
378         TP_STRUCT__entry(
379                 __array(        char,   parent_comm,    TASK_COMM_LEN   )
380                 __field(        pid_t,  parent_pid                      )
381                 __array(        char,   child_comm,     TASK_COMM_LEN   )
382                 __field(        pid_t,  child_pid                       )
383         ),
384 
385         TP_fast_assign(
386                 memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN);
387                 __entry->parent_pid     = parent->pid;
388                 memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN);
389                 __entry->child_pid      = child->pid;
390         ),
391 
392         TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d",
393                 __entry->parent_comm, __entry->parent_pid,
394                 __entry->child_comm, __entry->child_pid)
395 );
396 
397 /*
398  * Tracepoint for exec:
399  */
400 TRACE_EVENT(sched_process_exec,
401 
402         TP_PROTO(struct task_struct *p, pid_t old_pid,
403                  struct linux_binprm *bprm),
404 
405         TP_ARGS(p, old_pid, bprm),
406 
407         TP_STRUCT__entry(
408                 __string(       filename,       bprm->filename  )
409                 __field(        pid_t,          pid             )
410                 __field(        pid_t,          old_pid         )
411         ),
412 
413         TP_fast_assign(
414                 __assign_str(filename);
415                 __entry->pid            = p->pid;
416                 __entry->old_pid        = old_pid;
417         ),
418 
419         TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename),
420                   __entry->pid, __entry->old_pid)
421 );
422 
423 /**
424  * sched_prepare_exec - called before setting up new exec
425  * @task:       pointer to the current task
426  * @bprm:       pointer to linux_binprm used for new exec
427  *
428  * Called before flushing the old exec, where @task is still unchanged, but at
429  * the point of no return during switching to the new exec. At the point it is
430  * called the exec will either succeed, or on failure terminate the task. Also
431  * see the "sched_process_exec" tracepoint, which is called right after @task
432  * has successfully switched to the new exec.
433  */
434 TRACE_EVENT(sched_prepare_exec,
435 
436         TP_PROTO(struct task_struct *task, struct linux_binprm *bprm),
437 
438         TP_ARGS(task, bprm),
439 
440         TP_STRUCT__entry(
441                 __string(       interp,         bprm->interp    )
442                 __string(       filename,       bprm->filename  )
443                 __field(        pid_t,          pid             )
444                 __string(       comm,           task->comm      )
445         ),
446 
447         TP_fast_assign(
448                 __assign_str(interp);
449                 __assign_str(filename);
450                 __entry->pid = task->pid;
451                 __assign_str(comm);
452         ),
453 
454         TP_printk("interp=%s filename=%s pid=%d comm=%s",
455                   __get_str(interp), __get_str(filename),
456                   __entry->pid, __get_str(comm))
457 );
458 
459 #ifdef CONFIG_SCHEDSTATS
460 #define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT
461 #define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS
462 #else
463 #define DEFINE_EVENT_SCHEDSTAT DEFINE_EVENT_NOP
464 #define DECLARE_EVENT_CLASS_SCHEDSTAT DECLARE_EVENT_CLASS_NOP
465 #endif
466 
467 /*
468  * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
469  *     adding sched_stat support to SCHED_FIFO/RR would be welcome.
470  */
471 DECLARE_EVENT_CLASS_SCHEDSTAT(sched_stat_template,
472 
473         TP_PROTO(struct task_struct *tsk, u64 delay),
474 
475         TP_ARGS(__perf_task(tsk), __perf_count(delay)),
476 
477         TP_STRUCT__entry(
478                 __array( char,  comm,   TASK_COMM_LEN   )
479                 __field( pid_t, pid                     )
480                 __field( u64,   delay                   )
481         ),
482 
483         TP_fast_assign(
484                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
485                 __entry->pid    = tsk->pid;
486                 __entry->delay  = delay;
487         ),
488 
489         TP_printk("comm=%s pid=%d delay=%Lu [ns]",
490                         __entry->comm, __entry->pid,
491                         (unsigned long long)__entry->delay)
492 );
493 
494 /*
495  * Tracepoint for accounting wait time (time the task is runnable
496  * but not actually running due to scheduler contention).
497  */
498 DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_wait,
499              TP_PROTO(struct task_struct *tsk, u64 delay),
500              TP_ARGS(tsk, delay));
501 
502 /*
503  * Tracepoint for accounting sleep time (time the task is not runnable,
504  * including iowait, see below).
505  */
506 DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_sleep,
507              TP_PROTO(struct task_struct *tsk, u64 delay),
508              TP_ARGS(tsk, delay));
509 
510 /*
511  * Tracepoint for accounting iowait time (time the task is not runnable
512  * due to waiting on IO to complete).
513  */
514 DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_iowait,
515              TP_PROTO(struct task_struct *tsk, u64 delay),
516              TP_ARGS(tsk, delay));
517 
518 /*
519  * Tracepoint for accounting blocked time (time the task is in uninterruptible).
520  */
521 DEFINE_EVENT_SCHEDSTAT(sched_stat_template, sched_stat_blocked,
522              TP_PROTO(struct task_struct *tsk, u64 delay),
523              TP_ARGS(tsk, delay));
524 
525 /*
526  * Tracepoint for accounting runtime (time the task is executing
527  * on a CPU).
528  */
529 DECLARE_EVENT_CLASS(sched_stat_runtime,
530 
531         TP_PROTO(struct task_struct *tsk, u64 runtime),
532 
533         TP_ARGS(tsk, __perf_count(runtime)),
534 
535         TP_STRUCT__entry(
536                 __array( char,  comm,   TASK_COMM_LEN   )
537                 __field( pid_t, pid                     )
538                 __field( u64,   runtime                 )
539         ),
540 
541         TP_fast_assign(
542                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
543                 __entry->pid            = tsk->pid;
544                 __entry->runtime        = runtime;
545         ),
546 
547         TP_printk("comm=%s pid=%d runtime=%Lu [ns]",
548                         __entry->comm, __entry->pid,
549                         (unsigned long long)__entry->runtime)
550 );
551 
552 DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime,
553              TP_PROTO(struct task_struct *tsk, u64 runtime),
554              TP_ARGS(tsk, runtime));
555 
556 /*
557  * Tracepoint for showing priority inheritance modifying a tasks
558  * priority.
559  */
560 TRACE_EVENT(sched_pi_setprio,
561 
562         TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task),
563 
564         TP_ARGS(tsk, pi_task),
565 
566         TP_STRUCT__entry(
567                 __array( char,  comm,   TASK_COMM_LEN   )
568                 __field( pid_t, pid                     )
569                 __field( int,   oldprio                 )
570                 __field( int,   newprio                 )
571         ),
572 
573         TP_fast_assign(
574                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
575                 __entry->pid            = tsk->pid;
576                 __entry->oldprio        = tsk->prio;
577                 __entry->newprio        = pi_task ?
578                                 min(tsk->normal_prio, pi_task->prio) :
579                                 tsk->normal_prio;
580                 /* XXX SCHED_DEADLINE bits missing */
581         ),
582 
583         TP_printk("comm=%s pid=%d oldprio=%d newprio=%d",
584                         __entry->comm, __entry->pid,
585                         __entry->oldprio, __entry->newprio)
586 );
587 
588 #ifdef CONFIG_DETECT_HUNG_TASK
589 TRACE_EVENT(sched_process_hang,
590         TP_PROTO(struct task_struct *tsk),
591         TP_ARGS(tsk),
592 
593         TP_STRUCT__entry(
594                 __array( char,  comm,   TASK_COMM_LEN   )
595                 __field( pid_t, pid                     )
596         ),
597 
598         TP_fast_assign(
599                 memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
600                 __entry->pid = tsk->pid;
601         ),
602 
603         TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
604 );
605 #endif /* CONFIG_DETECT_HUNG_TASK */
606 
607 /*
608  * Tracks migration of tasks from one runqueue to another. Can be used to
609  * detect if automatic NUMA balancing is bouncing between nodes.
610  */
611 TRACE_EVENT(sched_move_numa,
612 
613         TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
614 
615         TP_ARGS(tsk, src_cpu, dst_cpu),
616 
617         TP_STRUCT__entry(
618                 __field( pid_t, pid                     )
619                 __field( pid_t, tgid                    )
620                 __field( pid_t, ngid                    )
621                 __field( int,   src_cpu                 )
622                 __field( int,   src_nid                 )
623                 __field( int,   dst_cpu                 )
624                 __field( int,   dst_nid                 )
625         ),
626 
627         TP_fast_assign(
628                 __entry->pid            = task_pid_nr(tsk);
629                 __entry->tgid           = task_tgid_nr(tsk);
630                 __entry->ngid           = task_numa_group_id(tsk);
631                 __entry->src_cpu        = src_cpu;
632                 __entry->src_nid        = cpu_to_node(src_cpu);
633                 __entry->dst_cpu        = dst_cpu;
634                 __entry->dst_nid        = cpu_to_node(dst_cpu);
635         ),
636 
637         TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d",
638                         __entry->pid, __entry->tgid, __entry->ngid,
639                         __entry->src_cpu, __entry->src_nid,
640                         __entry->dst_cpu, __entry->dst_nid)
641 );
642 
643 DECLARE_EVENT_CLASS(sched_numa_pair_template,
644 
645         TP_PROTO(struct task_struct *src_tsk, int src_cpu,
646                  struct task_struct *dst_tsk, int dst_cpu),
647 
648         TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu),
649 
650         TP_STRUCT__entry(
651                 __field( pid_t, src_pid                 )
652                 __field( pid_t, src_tgid                )
653                 __field( pid_t, src_ngid                )
654                 __field( int,   src_cpu                 )
655                 __field( int,   src_nid                 )
656                 __field( pid_t, dst_pid                 )
657                 __field( pid_t, dst_tgid                )
658                 __field( pid_t, dst_ngid                )
659                 __field( int,   dst_cpu                 )
660                 __field( int,   dst_nid                 )
661         ),
662 
663         TP_fast_assign(
664                 __entry->src_pid        = task_pid_nr(src_tsk);
665                 __entry->src_tgid       = task_tgid_nr(src_tsk);
666                 __entry->src_ngid       = task_numa_group_id(src_tsk);
667                 __entry->src_cpu        = src_cpu;
668                 __entry->src_nid        = cpu_to_node(src_cpu);
669                 __entry->dst_pid        = dst_tsk ? task_pid_nr(dst_tsk) : 0;
670                 __entry->dst_tgid       = dst_tsk ? task_tgid_nr(dst_tsk) : 0;
671                 __entry->dst_ngid       = dst_tsk ? task_numa_group_id(dst_tsk) : 0;
672                 __entry->dst_cpu        = dst_cpu;
673                 __entry->dst_nid        = dst_cpu >= 0 ? cpu_to_node(dst_cpu) : -1;
674         ),
675 
676         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",
677                         __entry->src_pid, __entry->src_tgid, __entry->src_ngid,
678                         __entry->src_cpu, __entry->src_nid,
679                         __entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid,
680                         __entry->dst_cpu, __entry->dst_nid)
681 );
682 
683 DEFINE_EVENT(sched_numa_pair_template, sched_stick_numa,
684 
685         TP_PROTO(struct task_struct *src_tsk, int src_cpu,
686                  struct task_struct *dst_tsk, int dst_cpu),
687 
688         TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
689 );
690 
691 DEFINE_EVENT(sched_numa_pair_template, sched_swap_numa,
692 
693         TP_PROTO(struct task_struct *src_tsk, int src_cpu,
694                  struct task_struct *dst_tsk, int dst_cpu),
695 
696         TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
697 );
698 
699 #ifdef CONFIG_NUMA_BALANCING
700 #define NUMAB_SKIP_REASON                                       \
701         EM( NUMAB_SKIP_UNSUITABLE,              "unsuitable" )  \
702         EM( NUMAB_SKIP_SHARED_RO,               "shared_ro" )   \
703         EM( NUMAB_SKIP_INACCESSIBLE,            "inaccessible" )        \
704         EM( NUMAB_SKIP_SCAN_DELAY,              "scan_delay" )  \
705         EM( NUMAB_SKIP_PID_INACTIVE,            "pid_inactive" )        \
706         EM( NUMAB_SKIP_IGNORE_PID,              "ignore_pid_inactive" )         \
707         EMe(NUMAB_SKIP_SEQ_COMPLETED,           "seq_completed" )
708 
709 /* Redefine for export. */
710 #undef EM
711 #undef EMe
712 #define EM(a, b)        TRACE_DEFINE_ENUM(a);
713 #define EMe(a, b)       TRACE_DEFINE_ENUM(a);
714 
715 NUMAB_SKIP_REASON
716 
717 /* Redefine for symbolic printing. */
718 #undef EM
719 #undef EMe
720 #define EM(a, b)        { a, b },
721 #define EMe(a, b)       { a, b }
722 
723 TRACE_EVENT(sched_skip_vma_numa,
724 
725         TP_PROTO(struct mm_struct *mm, struct vm_area_struct *vma,
726                  enum numa_vmaskip_reason reason),
727 
728         TP_ARGS(mm, vma, reason),
729 
730         TP_STRUCT__entry(
731                 __field(unsigned long, numa_scan_offset)
732                 __field(unsigned long, vm_start)
733                 __field(unsigned long, vm_end)
734                 __field(enum numa_vmaskip_reason, reason)
735         ),
736 
737         TP_fast_assign(
738                 __entry->numa_scan_offset       = mm->numa_scan_offset;
739                 __entry->vm_start               = vma->vm_start;
740                 __entry->vm_end                 = vma->vm_end;
741                 __entry->reason                 = reason;
742         ),
743 
744         TP_printk("numa_scan_offset=%lX vm_start=%lX vm_end=%lX reason=%s",
745                   __entry->numa_scan_offset,
746                   __entry->vm_start,
747                   __entry->vm_end,
748                   __print_symbolic(__entry->reason, NUMAB_SKIP_REASON))
749 );
750 #endif /* CONFIG_NUMA_BALANCING */
751 
752 /*
753  * Tracepoint for waking a polling cpu without an IPI.
754  */
755 TRACE_EVENT(sched_wake_idle_without_ipi,
756 
757         TP_PROTO(int cpu),
758 
759         TP_ARGS(cpu),
760 
761         TP_STRUCT__entry(
762                 __field(        int,    cpu     )
763         ),
764 
765         TP_fast_assign(
766                 __entry->cpu    = cpu;
767         ),
768 
769         TP_printk("cpu=%d", __entry->cpu)
770 );
771 
772 /*
773  * Following tracepoints are not exported in tracefs and provide hooking
774  * mechanisms only for testing and debugging purposes.
775  *
776  * Postfixed with _tp to make them easily identifiable in the code.
777  */
778 DECLARE_TRACE(pelt_cfs_tp,
779         TP_PROTO(struct cfs_rq *cfs_rq),
780         TP_ARGS(cfs_rq));
781 
782 DECLARE_TRACE(pelt_rt_tp,
783         TP_PROTO(struct rq *rq),
784         TP_ARGS(rq));
785 
786 DECLARE_TRACE(pelt_dl_tp,
787         TP_PROTO(struct rq *rq),
788         TP_ARGS(rq));
789 
790 DECLARE_TRACE(pelt_hw_tp,
791         TP_PROTO(struct rq *rq),
792         TP_ARGS(rq));
793 
794 DECLARE_TRACE(pelt_irq_tp,
795         TP_PROTO(struct rq *rq),
796         TP_ARGS(rq));
797 
798 DECLARE_TRACE(pelt_se_tp,
799         TP_PROTO(struct sched_entity *se),
800         TP_ARGS(se));
801 
802 DECLARE_TRACE(sched_cpu_capacity_tp,
803         TP_PROTO(struct rq *rq),
804         TP_ARGS(rq));
805 
806 DECLARE_TRACE(sched_overutilized_tp,
807         TP_PROTO(struct root_domain *rd, bool overutilized),
808         TP_ARGS(rd, overutilized));
809 
810 DECLARE_TRACE(sched_util_est_cfs_tp,
811         TP_PROTO(struct cfs_rq *cfs_rq),
812         TP_ARGS(cfs_rq));
813 
814 DECLARE_TRACE(sched_util_est_se_tp,
815         TP_PROTO(struct sched_entity *se),
816         TP_ARGS(se));
817 
818 DECLARE_TRACE(sched_update_nr_running_tp,
819         TP_PROTO(struct rq *rq, int change),
820         TP_ARGS(rq, change));
821 
822 DECLARE_TRACE(sched_compute_energy_tp,
823         TP_PROTO(struct task_struct *p, int dst_cpu, unsigned long energy,
824                  unsigned long max_util, unsigned long busy_time),
825         TP_ARGS(p, dst_cpu, energy, max_util, busy_time));
826 
827 #endif /* _TRACE_SCHED_H */
828 
829 /* This part must be outside protection */
830 #include <trace/define_trace.h>
831 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php