xref: /openbmc/linux/include/trace/events/sched.h (revision 2a09b5de)
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