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