xref: /linux/include/trace/events/sched.h (revision efb40f588b4370ffaeffafbd50f6ff213d954254)
1d0b6e04aSLi Zefan #undef TRACE_SYSTEM
2d0b6e04aSLi Zefan #define TRACE_SYSTEM sched
3d0b6e04aSLi Zefan 
4ea20d929SSteven Rostedt #if !defined(_TRACE_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
50a16b607SMathieu Desnoyers #define _TRACE_SCHED_H
60a16b607SMathieu Desnoyers 
76a3827d7SIngo Molnar #include <linux/sched/numa_balancing.h>
80a16b607SMathieu Desnoyers #include <linux/tracepoint.h>
94ff16c25SDavid Smith #include <linux/binfmts.h>
100a16b607SMathieu Desnoyers 
11ea20d929SSteven Rostedt /*
12ea20d929SSteven Rostedt  * Tracepoint for calling kthread_stop, performed to end a kthread:
13ea20d929SSteven Rostedt  */
14ea20d929SSteven Rostedt TRACE_EVENT(sched_kthread_stop,
15ea20d929SSteven Rostedt 
16ea20d929SSteven Rostedt 	TP_PROTO(struct task_struct *t),
17ea20d929SSteven Rostedt 
18ea20d929SSteven Rostedt 	TP_ARGS(t),
19ea20d929SSteven Rostedt 
20ea20d929SSteven Rostedt 	TP_STRUCT__entry(
21ea20d929SSteven Rostedt 		__array(	char,	comm,	TASK_COMM_LEN	)
22ea20d929SSteven Rostedt 		__field(	pid_t,	pid			)
23ea20d929SSteven Rostedt 	),
24ea20d929SSteven Rostedt 
25ea20d929SSteven Rostedt 	TP_fast_assign(
26ea20d929SSteven Rostedt 		memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
27ea20d929SSteven Rostedt 		__entry->pid	= t->pid;
28ea20d929SSteven Rostedt 	),
29ea20d929SSteven Rostedt 
30434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
31ea20d929SSteven Rostedt );
32ea20d929SSteven Rostedt 
33ea20d929SSteven Rostedt /*
34ea20d929SSteven Rostedt  * Tracepoint for the return value of the kthread stopping:
35ea20d929SSteven Rostedt  */
36ea20d929SSteven Rostedt TRACE_EVENT(sched_kthread_stop_ret,
37ea20d929SSteven Rostedt 
38ea20d929SSteven Rostedt 	TP_PROTO(int ret),
39ea20d929SSteven Rostedt 
40ea20d929SSteven Rostedt 	TP_ARGS(ret),
41ea20d929SSteven Rostedt 
42ea20d929SSteven Rostedt 	TP_STRUCT__entry(
43ea20d929SSteven Rostedt 		__field(	int,	ret	)
44ea20d929SSteven Rostedt 	),
45ea20d929SSteven Rostedt 
46ea20d929SSteven Rostedt 	TP_fast_assign(
47ea20d929SSteven Rostedt 		__entry->ret	= ret;
48ea20d929SSteven Rostedt 	),
49ea20d929SSteven Rostedt 
50434a83c3SIngo Molnar 	TP_printk("ret=%d", __entry->ret)
51ea20d929SSteven Rostedt );
52ea20d929SSteven Rostedt 
53ea20d929SSteven Rostedt /*
54ea20d929SSteven Rostedt  * Tracepoint for waking up a task:
55ea20d929SSteven Rostedt  */
56091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_wakeup_template,
57ea20d929SSteven Rostedt 
58fbd705a0SPeter Zijlstra 	TP_PROTO(struct task_struct *p),
59ea20d929SSteven Rostedt 
60fbd705a0SPeter Zijlstra 	TP_ARGS(__perf_task(p)),
61ea20d929SSteven Rostedt 
62ea20d929SSteven Rostedt 	TP_STRUCT__entry(
63ea20d929SSteven Rostedt 		__array(	char,	comm,	TASK_COMM_LEN	)
64ea20d929SSteven Rostedt 		__field(	pid_t,	pid			)
65ea20d929SSteven Rostedt 		__field(	int,	prio			)
66ea20d929SSteven Rostedt 		__field(	int,	success			)
67434a83c3SIngo Molnar 		__field(	int,	target_cpu		)
68ea20d929SSteven Rostedt 	),
69ea20d929SSteven Rostedt 
70ea20d929SSteven Rostedt 	TP_fast_assign(
71ea20d929SSteven Rostedt 		memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
72ea20d929SSteven Rostedt 		__entry->pid		= p->pid;
73b91473ffSPeter Zijlstra 		__entry->prio		= p->prio; /* XXX SCHED_DEADLINE */
74fbd705a0SPeter Zijlstra 		__entry->success	= 1; /* rudiment, kill when possible */
75434a83c3SIngo Molnar 		__entry->target_cpu	= task_cpu(p);
76ea20d929SSteven Rostedt 	),
77ea20d929SSteven Rostedt 
78fbd705a0SPeter Zijlstra 	TP_printk("comm=%s pid=%d prio=%d target_cpu=%03d",
79ea20d929SSteven Rostedt 		  __entry->comm, __entry->pid, __entry->prio,
80fbd705a0SPeter Zijlstra 		  __entry->target_cpu)
81ea20d929SSteven Rostedt );
82ea20d929SSteven Rostedt 
83fbd705a0SPeter Zijlstra /*
84fbd705a0SPeter Zijlstra  * Tracepoint called when waking a task; this tracepoint is guaranteed to be
85fbd705a0SPeter Zijlstra  * called from the waking context.
86fbd705a0SPeter Zijlstra  */
87fbd705a0SPeter Zijlstra DEFINE_EVENT(sched_wakeup_template, sched_waking,
88fbd705a0SPeter Zijlstra 	     TP_PROTO(struct task_struct *p),
89fbd705a0SPeter Zijlstra 	     TP_ARGS(p));
90fbd705a0SPeter Zijlstra 
91fbd705a0SPeter Zijlstra /*
92fbd705a0SPeter Zijlstra  * Tracepoint called when the task is actually woken; p->state == TASK_RUNNNG.
93fbd705a0SPeter Zijlstra  * It it not always called from the waking context.
94fbd705a0SPeter Zijlstra  */
9575ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup,
96fbd705a0SPeter Zijlstra 	     TP_PROTO(struct task_struct *p),
97fbd705a0SPeter Zijlstra 	     TP_ARGS(p));
9875ec29abSSteven Rostedt 
99ea20d929SSteven Rostedt /*
100ea20d929SSteven Rostedt  * Tracepoint for waking up a new task:
101ea20d929SSteven Rostedt  */
10275ec29abSSteven Rostedt DEFINE_EVENT(sched_wakeup_template, sched_wakeup_new,
103fbd705a0SPeter Zijlstra 	     TP_PROTO(struct task_struct *p),
104fbd705a0SPeter Zijlstra 	     TP_ARGS(p));
105ea20d929SSteven Rostedt 
10602f72694SPeter Zijlstra #ifdef CREATE_TRACE_POINTS
107c73464b1SPeter Zijlstra static inline long __trace_sched_switch_state(bool preempt, struct task_struct *p)
10802f72694SPeter Zijlstra {
1098f9fbf09SOleg Nesterov #ifdef CONFIG_SCHED_DEBUG
1108f9fbf09SOleg Nesterov 	BUG_ON(p != current);
1118f9fbf09SOleg Nesterov #endif /* CONFIG_SCHED_DEBUG */
11202f72694SPeter Zijlstra 
113c73464b1SPeter Zijlstra 	/*
114c73464b1SPeter Zijlstra 	 * Preemption ignores task state, therefore preempted tasks are always
115c73464b1SPeter Zijlstra 	 * RUNNING (we will not have dequeued if state != RUNNING).
116c73464b1SPeter Zijlstra 	 */
117*efb40f58SPeter Zijlstra 	if (preempt)
118*efb40f58SPeter Zijlstra 		return TASK_STATE_MAX;
119*efb40f58SPeter Zijlstra 
120*efb40f58SPeter Zijlstra 	return __get_task_state(p);
12102f72694SPeter Zijlstra }
1228f9fbf09SOleg Nesterov #endif /* CREATE_TRACE_POINTS */
12302f72694SPeter Zijlstra 
124ea20d929SSteven Rostedt /*
125ea20d929SSteven Rostedt  * Tracepoint for task switches, performed by the scheduler:
126ea20d929SSteven Rostedt  */
127ea20d929SSteven Rostedt TRACE_EVENT(sched_switch,
128ea20d929SSteven Rostedt 
129c73464b1SPeter Zijlstra 	TP_PROTO(bool preempt,
130c73464b1SPeter Zijlstra 		 struct task_struct *prev,
131ea20d929SSteven Rostedt 		 struct task_struct *next),
132ea20d929SSteven Rostedt 
133c73464b1SPeter Zijlstra 	TP_ARGS(preempt, prev, next),
134ea20d929SSteven Rostedt 
135ea20d929SSteven Rostedt 	TP_STRUCT__entry(
136ea20d929SSteven Rostedt 		__array(	char,	prev_comm,	TASK_COMM_LEN	)
137ea20d929SSteven Rostedt 		__field(	pid_t,	prev_pid			)
138ea20d929SSteven Rostedt 		__field(	int,	prev_prio			)
139937cdb9dSSteven Rostedt 		__field(	long,	prev_state			)
140ea20d929SSteven Rostedt 		__array(	char,	next_comm,	TASK_COMM_LEN	)
141ea20d929SSteven Rostedt 		__field(	pid_t,	next_pid			)
142ea20d929SSteven Rostedt 		__field(	int,	next_prio			)
143ea20d929SSteven Rostedt 	),
144ea20d929SSteven Rostedt 
145ea20d929SSteven Rostedt 	TP_fast_assign(
146ea20d929SSteven Rostedt 		memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
147ea20d929SSteven Rostedt 		__entry->prev_pid	= prev->pid;
148ea20d929SSteven Rostedt 		__entry->prev_prio	= prev->prio;
149c73464b1SPeter Zijlstra 		__entry->prev_state	= __trace_sched_switch_state(preempt, prev);
150ea20d929SSteven Rostedt 		memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
151ea20d929SSteven Rostedt 		__entry->next_pid	= next->pid;
152ea20d929SSteven Rostedt 		__entry->next_prio	= next->prio;
153b91473ffSPeter Zijlstra 		/* XXX SCHED_DEADLINE */
154ea20d929SSteven Rostedt 	),
155ea20d929SSteven Rostedt 
156557ab425SPeter 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",
157ea20d929SSteven Rostedt 		__entry->prev_comm, __entry->prev_pid, __entry->prev_prio,
158*efb40f58SPeter Zijlstra 
159*efb40f58SPeter Zijlstra 		(__entry->prev_state & TASK_REPORT) ?
160*efb40f58SPeter Zijlstra 		  __print_flags(__entry->prev_state & TASK_REPORT, "|",
161*efb40f58SPeter Zijlstra 				{ 0x01, "S" }, { 0x02, "D" }, { 0x04, "T" },
162*efb40f58SPeter Zijlstra 				{ 0x08, "t" }, { 0x10, "X" }, { 0x20, "Z" }) :
163*efb40f58SPeter Zijlstra 		  "R",
164*efb40f58SPeter Zijlstra 
165557ab425SPeter Zijlstra 		__entry->prev_state & TASK_STATE_MAX ? "+" : "",
166ea20d929SSteven Rostedt 		__entry->next_comm, __entry->next_pid, __entry->next_prio)
167ea20d929SSteven Rostedt );
168ea20d929SSteven Rostedt 
169ea20d929SSteven Rostedt /*
170ea20d929SSteven Rostedt  * Tracepoint for a task being migrated:
171ea20d929SSteven Rostedt  */
172ea20d929SSteven Rostedt TRACE_EVENT(sched_migrate_task,
173ea20d929SSteven Rostedt 
174de1d7286SMathieu Desnoyers 	TP_PROTO(struct task_struct *p, int dest_cpu),
175ea20d929SSteven Rostedt 
176de1d7286SMathieu Desnoyers 	TP_ARGS(p, dest_cpu),
177ea20d929SSteven Rostedt 
178ea20d929SSteven Rostedt 	TP_STRUCT__entry(
179ea20d929SSteven Rostedt 		__array(	char,	comm,	TASK_COMM_LEN	)
180ea20d929SSteven Rostedt 		__field(	pid_t,	pid			)
181ea20d929SSteven Rostedt 		__field(	int,	prio			)
182ea20d929SSteven Rostedt 		__field(	int,	orig_cpu		)
183ea20d929SSteven Rostedt 		__field(	int,	dest_cpu		)
184ea20d929SSteven Rostedt 	),
185ea20d929SSteven Rostedt 
186ea20d929SSteven Rostedt 	TP_fast_assign(
187ea20d929SSteven Rostedt 		memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
188ea20d929SSteven Rostedt 		__entry->pid		= p->pid;
189b91473ffSPeter Zijlstra 		__entry->prio		= p->prio; /* XXX SCHED_DEADLINE */
190de1d7286SMathieu Desnoyers 		__entry->orig_cpu	= task_cpu(p);
191ea20d929SSteven Rostedt 		__entry->dest_cpu	= dest_cpu;
192ea20d929SSteven Rostedt 	),
193ea20d929SSteven Rostedt 
194434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d prio=%d orig_cpu=%d dest_cpu=%d",
195ea20d929SSteven Rostedt 		  __entry->comm, __entry->pid, __entry->prio,
196ea20d929SSteven Rostedt 		  __entry->orig_cpu, __entry->dest_cpu)
197ea20d929SSteven Rostedt );
198ea20d929SSteven Rostedt 
199091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_process_template,
200ea20d929SSteven Rostedt 
201ea20d929SSteven Rostedt 	TP_PROTO(struct task_struct *p),
202ea20d929SSteven Rostedt 
203ea20d929SSteven Rostedt 	TP_ARGS(p),
204ea20d929SSteven Rostedt 
205ea20d929SSteven Rostedt 	TP_STRUCT__entry(
206ea20d929SSteven Rostedt 		__array(	char,	comm,	TASK_COMM_LEN	)
207ea20d929SSteven Rostedt 		__field(	pid_t,	pid			)
208ea20d929SSteven Rostedt 		__field(	int,	prio			)
209ea20d929SSteven Rostedt 	),
210ea20d929SSteven Rostedt 
211ea20d929SSteven Rostedt 	TP_fast_assign(
212ea20d929SSteven Rostedt 		memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
213ea20d929SSteven Rostedt 		__entry->pid		= p->pid;
214b91473ffSPeter Zijlstra 		__entry->prio		= p->prio; /* XXX SCHED_DEADLINE */
215ea20d929SSteven Rostedt 	),
216ea20d929SSteven Rostedt 
217434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d prio=%d",
218ea20d929SSteven Rostedt 		  __entry->comm, __entry->pid, __entry->prio)
219ea20d929SSteven Rostedt );
220ea20d929SSteven Rostedt 
221ea20d929SSteven Rostedt /*
22275ec29abSSteven Rostedt  * Tracepoint for freeing a task:
22375ec29abSSteven Rostedt  */
22475ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_free,
22575ec29abSSteven Rostedt 	     TP_PROTO(struct task_struct *p),
22675ec29abSSteven Rostedt 	     TP_ARGS(p));
22775ec29abSSteven Rostedt 
22875ec29abSSteven Rostedt 
22975ec29abSSteven Rostedt /*
230ea20d929SSteven Rostedt  * Tracepoint for a task exiting:
231ea20d929SSteven Rostedt  */
23275ec29abSSteven Rostedt DEFINE_EVENT(sched_process_template, sched_process_exit,
233ea20d929SSteven Rostedt 	     TP_PROTO(struct task_struct *p),
23475ec29abSSteven Rostedt 	     TP_ARGS(p));
235ea20d929SSteven Rostedt 
236ea20d929SSteven Rostedt /*
237210f7669SLi Zefan  * Tracepoint for waiting on task to unschedule:
238210f7669SLi Zefan  */
239210f7669SLi Zefan DEFINE_EVENT(sched_process_template, sched_wait_task,
240210f7669SLi Zefan 	TP_PROTO(struct task_struct *p),
241210f7669SLi Zefan 	TP_ARGS(p));
242210f7669SLi Zefan 
243210f7669SLi Zefan /*
244ea20d929SSteven Rostedt  * Tracepoint for a waiting task:
245ea20d929SSteven Rostedt  */
246ea20d929SSteven Rostedt TRACE_EVENT(sched_process_wait,
247ea20d929SSteven Rostedt 
248ea20d929SSteven Rostedt 	TP_PROTO(struct pid *pid),
249ea20d929SSteven Rostedt 
250ea20d929SSteven Rostedt 	TP_ARGS(pid),
251ea20d929SSteven Rostedt 
252ea20d929SSteven Rostedt 	TP_STRUCT__entry(
253ea20d929SSteven Rostedt 		__array(	char,	comm,	TASK_COMM_LEN	)
254ea20d929SSteven Rostedt 		__field(	pid_t,	pid			)
255ea20d929SSteven Rostedt 		__field(	int,	prio			)
256ea20d929SSteven Rostedt 	),
257ea20d929SSteven Rostedt 
258ea20d929SSteven Rostedt 	TP_fast_assign(
259ea20d929SSteven Rostedt 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
260ea20d929SSteven Rostedt 		__entry->pid		= pid_nr(pid);
261b91473ffSPeter Zijlstra 		__entry->prio		= current->prio; /* XXX SCHED_DEADLINE */
262ea20d929SSteven Rostedt 	),
263ea20d929SSteven Rostedt 
264434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d prio=%d",
265ea20d929SSteven Rostedt 		  __entry->comm, __entry->pid, __entry->prio)
266ea20d929SSteven Rostedt );
267ea20d929SSteven Rostedt 
268ea20d929SSteven Rostedt /*
269ea20d929SSteven Rostedt  * Tracepoint for do_fork:
270ea20d929SSteven Rostedt  */
271ea20d929SSteven Rostedt TRACE_EVENT(sched_process_fork,
272ea20d929SSteven Rostedt 
273ea20d929SSteven Rostedt 	TP_PROTO(struct task_struct *parent, struct task_struct *child),
274ea20d929SSteven Rostedt 
275ea20d929SSteven Rostedt 	TP_ARGS(parent, child),
276ea20d929SSteven Rostedt 
277ea20d929SSteven Rostedt 	TP_STRUCT__entry(
278ea20d929SSteven Rostedt 		__array(	char,	parent_comm,	TASK_COMM_LEN	)
279ea20d929SSteven Rostedt 		__field(	pid_t,	parent_pid			)
280ea20d929SSteven Rostedt 		__array(	char,	child_comm,	TASK_COMM_LEN	)
281ea20d929SSteven Rostedt 		__field(	pid_t,	child_pid			)
282ea20d929SSteven Rostedt 	),
283ea20d929SSteven Rostedt 
284ea20d929SSteven Rostedt 	TP_fast_assign(
285ea20d929SSteven Rostedt 		memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN);
286ea20d929SSteven Rostedt 		__entry->parent_pid	= parent->pid;
287ea20d929SSteven Rostedt 		memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN);
288ea20d929SSteven Rostedt 		__entry->child_pid	= child->pid;
289ea20d929SSteven Rostedt 	),
290ea20d929SSteven Rostedt 
291434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d child_comm=%s child_pid=%d",
292ea20d929SSteven Rostedt 		__entry->parent_comm, __entry->parent_pid,
293ea20d929SSteven Rostedt 		__entry->child_comm, __entry->child_pid)
294ea20d929SSteven Rostedt );
295ea20d929SSteven Rostedt 
296ea20d929SSteven Rostedt /*
2974ff16c25SDavid Smith  * Tracepoint for exec:
2984ff16c25SDavid Smith  */
2994ff16c25SDavid Smith TRACE_EVENT(sched_process_exec,
3004ff16c25SDavid Smith 
3014ff16c25SDavid Smith 	TP_PROTO(struct task_struct *p, pid_t old_pid,
3024ff16c25SDavid Smith 		 struct linux_binprm *bprm),
3034ff16c25SDavid Smith 
3044ff16c25SDavid Smith 	TP_ARGS(p, old_pid, bprm),
3054ff16c25SDavid Smith 
3064ff16c25SDavid Smith 	TP_STRUCT__entry(
3074ff16c25SDavid Smith 		__string(	filename,	bprm->filename	)
3084ff16c25SDavid Smith 		__field(	pid_t,		pid		)
3094ff16c25SDavid Smith 		__field(	pid_t,		old_pid		)
3104ff16c25SDavid Smith 	),
3114ff16c25SDavid Smith 
3124ff16c25SDavid Smith 	TP_fast_assign(
3134ff16c25SDavid Smith 		__assign_str(filename, bprm->filename);
3144ff16c25SDavid Smith 		__entry->pid		= p->pid;
3156308191fSOleg Nesterov 		__entry->old_pid	= old_pid;
3164ff16c25SDavid Smith 	),
3174ff16c25SDavid Smith 
3184ff16c25SDavid Smith 	TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename),
3194ff16c25SDavid Smith 		  __entry->pid, __entry->old_pid)
3204ff16c25SDavid Smith );
3214ff16c25SDavid Smith 
3224ff16c25SDavid Smith /*
323768d0c27SPeter Zijlstra  * XXX the below sched_stat tracepoints only apply to SCHED_OTHER/BATCH/IDLE
324768d0c27SPeter Zijlstra  *     adding sched_stat support to SCHED_FIFO/RR would be welcome.
325768d0c27SPeter Zijlstra  */
326091ad365SIngo Molnar DECLARE_EVENT_CLASS(sched_stat_template,
327768d0c27SPeter Zijlstra 
328768d0c27SPeter Zijlstra 	TP_PROTO(struct task_struct *tsk, u64 delay),
329768d0c27SPeter Zijlstra 
33012473965SOleg Nesterov 	TP_ARGS(__perf_task(tsk), __perf_count(delay)),
331768d0c27SPeter Zijlstra 
332768d0c27SPeter Zijlstra 	TP_STRUCT__entry(
333768d0c27SPeter Zijlstra 		__array( char,	comm,	TASK_COMM_LEN	)
334768d0c27SPeter Zijlstra 		__field( pid_t,	pid			)
335768d0c27SPeter Zijlstra 		__field( u64,	delay			)
336768d0c27SPeter Zijlstra 	),
337768d0c27SPeter Zijlstra 
338768d0c27SPeter Zijlstra 	TP_fast_assign(
339768d0c27SPeter Zijlstra 		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
340768d0c27SPeter Zijlstra 		__entry->pid	= tsk->pid;
341768d0c27SPeter Zijlstra 		__entry->delay	= delay;
342768d0c27SPeter Zijlstra 	),
343768d0c27SPeter Zijlstra 
344434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d delay=%Lu [ns]",
345768d0c27SPeter Zijlstra 			__entry->comm, __entry->pid,
346768d0c27SPeter Zijlstra 			(unsigned long long)__entry->delay)
347768d0c27SPeter Zijlstra );
348768d0c27SPeter Zijlstra 
34975ec29abSSteven Rostedt 
35075ec29abSSteven Rostedt /*
35175ec29abSSteven Rostedt  * Tracepoint for accounting wait time (time the task is runnable
35275ec29abSSteven Rostedt  * but not actually running due to scheduler contention).
35375ec29abSSteven Rostedt  */
35475ec29abSSteven Rostedt DEFINE_EVENT(sched_stat_template, sched_stat_wait,
35575ec29abSSteven Rostedt 	     TP_PROTO(struct task_struct *tsk, u64 delay),
35675ec29abSSteven Rostedt 	     TP_ARGS(tsk, delay));
35775ec29abSSteven Rostedt 
35875ec29abSSteven Rostedt /*
35975ec29abSSteven Rostedt  * Tracepoint for accounting sleep time (time the task is not runnable,
36075ec29abSSteven Rostedt  * including iowait, see below).
36175ec29abSSteven Rostedt  */
362470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_sleep,
36375ec29abSSteven Rostedt 	     TP_PROTO(struct task_struct *tsk, u64 delay),
364470dda74SLi Zefan 	     TP_ARGS(tsk, delay));
36575ec29abSSteven Rostedt 
36675ec29abSSteven Rostedt /*
36775ec29abSSteven Rostedt  * Tracepoint for accounting iowait time (time the task is not runnable
36875ec29abSSteven Rostedt  * due to waiting on IO to complete).
36975ec29abSSteven Rostedt  */
370470dda74SLi Zefan DEFINE_EVENT(sched_stat_template, sched_stat_iowait,
37175ec29abSSteven Rostedt 	     TP_PROTO(struct task_struct *tsk, u64 delay),
372470dda74SLi Zefan 	     TP_ARGS(tsk, delay));
37375ec29abSSteven Rostedt 
374768d0c27SPeter Zijlstra /*
375b781a602SAndrew Vagin  * Tracepoint for accounting blocked time (time the task is in uninterruptible).
376b781a602SAndrew Vagin  */
377b781a602SAndrew Vagin DEFINE_EVENT(sched_stat_template, sched_stat_blocked,
378b781a602SAndrew Vagin 	     TP_PROTO(struct task_struct *tsk, u64 delay),
379b781a602SAndrew Vagin 	     TP_ARGS(tsk, delay));
380b781a602SAndrew Vagin 
381b781a602SAndrew Vagin /*
382f977bb49SIngo Molnar  * Tracepoint for accounting runtime (time the task is executing
383f977bb49SIngo Molnar  * on a CPU).
384f977bb49SIngo Molnar  */
38536009d07SOleg Nesterov DECLARE_EVENT_CLASS(sched_stat_runtime,
386f977bb49SIngo Molnar 
387f977bb49SIngo Molnar 	TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
388f977bb49SIngo Molnar 
38912473965SOleg Nesterov 	TP_ARGS(tsk, __perf_count(runtime), vruntime),
390f977bb49SIngo Molnar 
391f977bb49SIngo Molnar 	TP_STRUCT__entry(
392f977bb49SIngo Molnar 		__array( char,	comm,	TASK_COMM_LEN	)
393f977bb49SIngo Molnar 		__field( pid_t,	pid			)
394f977bb49SIngo Molnar 		__field( u64,	runtime			)
395f977bb49SIngo Molnar 		__field( u64,	vruntime			)
396f977bb49SIngo Molnar 	),
397f977bb49SIngo Molnar 
398f977bb49SIngo Molnar 	TP_fast_assign(
399f977bb49SIngo Molnar 		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
400f977bb49SIngo Molnar 		__entry->pid		= tsk->pid;
401f977bb49SIngo Molnar 		__entry->runtime	= runtime;
402f977bb49SIngo Molnar 		__entry->vruntime	= vruntime;
403f977bb49SIngo Molnar 	),
404f977bb49SIngo Molnar 
405434a83c3SIngo Molnar 	TP_printk("comm=%s pid=%d runtime=%Lu [ns] vruntime=%Lu [ns]",
406f977bb49SIngo Molnar 			__entry->comm, __entry->pid,
407f977bb49SIngo Molnar 			(unsigned long long)__entry->runtime,
408f977bb49SIngo Molnar 			(unsigned long long)__entry->vruntime)
409f977bb49SIngo Molnar );
410f977bb49SIngo Molnar 
41136009d07SOleg Nesterov DEFINE_EVENT(sched_stat_runtime, sched_stat_runtime,
41236009d07SOleg Nesterov 	     TP_PROTO(struct task_struct *tsk, u64 runtime, u64 vruntime),
41336009d07SOleg Nesterov 	     TP_ARGS(tsk, runtime, vruntime));
41436009d07SOleg Nesterov 
415a8027073SSteven Rostedt /*
416a8027073SSteven Rostedt  * Tracepoint for showing priority inheritance modifying a tasks
417a8027073SSteven Rostedt  * priority.
418a8027073SSteven Rostedt  */
419a8027073SSteven Rostedt TRACE_EVENT(sched_pi_setprio,
420a8027073SSteven Rostedt 
421b91473ffSPeter Zijlstra 	TP_PROTO(struct task_struct *tsk, struct task_struct *pi_task),
422a8027073SSteven Rostedt 
423b91473ffSPeter Zijlstra 	TP_ARGS(tsk, pi_task),
424a8027073SSteven Rostedt 
425a8027073SSteven Rostedt 	TP_STRUCT__entry(
426a8027073SSteven Rostedt 		__array( char,	comm,	TASK_COMM_LEN	)
427a8027073SSteven Rostedt 		__field( pid_t,	pid			)
428a8027073SSteven Rostedt 		__field( int,	oldprio			)
429a8027073SSteven Rostedt 		__field( int,	newprio			)
430a8027073SSteven Rostedt 	),
431a8027073SSteven Rostedt 
432a8027073SSteven Rostedt 	TP_fast_assign(
433a8027073SSteven Rostedt 		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
434a8027073SSteven Rostedt 		__entry->pid		= tsk->pid;
435a8027073SSteven Rostedt 		__entry->oldprio	= tsk->prio;
436b91473ffSPeter Zijlstra 		__entry->newprio	= pi_task ? pi_task->prio : tsk->prio;
437b91473ffSPeter Zijlstra 		/* XXX SCHED_DEADLINE bits missing */
438a8027073SSteven Rostedt 	),
439a8027073SSteven Rostedt 
440a8027073SSteven Rostedt 	TP_printk("comm=%s pid=%d oldprio=%d newprio=%d",
441a8027073SSteven Rostedt 			__entry->comm, __entry->pid,
442a8027073SSteven Rostedt 			__entry->oldprio, __entry->newprio)
443a8027073SSteven Rostedt );
444a8027073SSteven Rostedt 
4456a716c90SOleg Nesterov #ifdef CONFIG_DETECT_HUNG_TASK
4466a716c90SOleg Nesterov TRACE_EVENT(sched_process_hang,
4476a716c90SOleg Nesterov 	TP_PROTO(struct task_struct *tsk),
4486a716c90SOleg Nesterov 	TP_ARGS(tsk),
4496a716c90SOleg Nesterov 
4506a716c90SOleg Nesterov 	TP_STRUCT__entry(
4516a716c90SOleg Nesterov 		__array( char,	comm,	TASK_COMM_LEN	)
4526a716c90SOleg Nesterov 		__field( pid_t,	pid			)
4536a716c90SOleg Nesterov 	),
4546a716c90SOleg Nesterov 
4556a716c90SOleg Nesterov 	TP_fast_assign(
4566a716c90SOleg Nesterov 		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
4576a716c90SOleg Nesterov 		__entry->pid = tsk->pid;
4586a716c90SOleg Nesterov 	),
4596a716c90SOleg Nesterov 
4606a716c90SOleg Nesterov 	TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid)
4616a716c90SOleg Nesterov );
4626a716c90SOleg Nesterov #endif /* CONFIG_DETECT_HUNG_TASK */
4636a716c90SOleg Nesterov 
464286549dcSMel Gorman DECLARE_EVENT_CLASS(sched_move_task_template,
465286549dcSMel Gorman 
466286549dcSMel Gorman 	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
467286549dcSMel Gorman 
468286549dcSMel Gorman 	TP_ARGS(tsk, src_cpu, dst_cpu),
469286549dcSMel Gorman 
470286549dcSMel Gorman 	TP_STRUCT__entry(
471286549dcSMel Gorman 		__field( pid_t,	pid			)
472286549dcSMel Gorman 		__field( pid_t,	tgid			)
473286549dcSMel Gorman 		__field( pid_t,	ngid			)
474286549dcSMel Gorman 		__field( int,	src_cpu			)
475286549dcSMel Gorman 		__field( int,	src_nid			)
476286549dcSMel Gorman 		__field( int,	dst_cpu			)
477286549dcSMel Gorman 		__field( int,	dst_nid			)
478286549dcSMel Gorman 	),
479286549dcSMel Gorman 
480286549dcSMel Gorman 	TP_fast_assign(
481286549dcSMel Gorman 		__entry->pid		= task_pid_nr(tsk);
482286549dcSMel Gorman 		__entry->tgid		= task_tgid_nr(tsk);
483286549dcSMel Gorman 		__entry->ngid		= task_numa_group_id(tsk);
484286549dcSMel Gorman 		__entry->src_cpu	= src_cpu;
485286549dcSMel Gorman 		__entry->src_nid	= cpu_to_node(src_cpu);
486286549dcSMel Gorman 		__entry->dst_cpu	= dst_cpu;
487286549dcSMel Gorman 		__entry->dst_nid	= cpu_to_node(dst_cpu);
488286549dcSMel Gorman 	),
489286549dcSMel Gorman 
490286549dcSMel Gorman 	TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d",
491286549dcSMel Gorman 			__entry->pid, __entry->tgid, __entry->ngid,
492286549dcSMel Gorman 			__entry->src_cpu, __entry->src_nid,
493286549dcSMel Gorman 			__entry->dst_cpu, __entry->dst_nid)
494286549dcSMel Gorman );
495286549dcSMel Gorman 
496286549dcSMel Gorman /*
497286549dcSMel Gorman  * Tracks migration of tasks from one runqueue to another. Can be used to
498286549dcSMel Gorman  * detect if automatic NUMA balancing is bouncing between nodes
499286549dcSMel Gorman  */
500286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_move_numa,
501286549dcSMel Gorman 	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
502286549dcSMel Gorman 
503286549dcSMel Gorman 	TP_ARGS(tsk, src_cpu, dst_cpu)
504286549dcSMel Gorman );
505286549dcSMel Gorman 
506286549dcSMel Gorman DEFINE_EVENT(sched_move_task_template, sched_stick_numa,
507286549dcSMel Gorman 	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
508286549dcSMel Gorman 
509286549dcSMel Gorman 	TP_ARGS(tsk, src_cpu, dst_cpu)
510286549dcSMel Gorman );
511286549dcSMel Gorman 
512286549dcSMel Gorman TRACE_EVENT(sched_swap_numa,
513286549dcSMel Gorman 
514286549dcSMel Gorman 	TP_PROTO(struct task_struct *src_tsk, int src_cpu,
515286549dcSMel Gorman 		 struct task_struct *dst_tsk, int dst_cpu),
516286549dcSMel Gorman 
517286549dcSMel Gorman 	TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu),
518286549dcSMel Gorman 
519286549dcSMel Gorman 	TP_STRUCT__entry(
520286549dcSMel Gorman 		__field( pid_t,	src_pid			)
521286549dcSMel Gorman 		__field( pid_t,	src_tgid		)
522286549dcSMel Gorman 		__field( pid_t,	src_ngid		)
523286549dcSMel Gorman 		__field( int,	src_cpu			)
524286549dcSMel Gorman 		__field( int,	src_nid			)
525286549dcSMel Gorman 		__field( pid_t,	dst_pid			)
526286549dcSMel Gorman 		__field( pid_t,	dst_tgid		)
527286549dcSMel Gorman 		__field( pid_t,	dst_ngid		)
528286549dcSMel Gorman 		__field( int,	dst_cpu			)
529286549dcSMel Gorman 		__field( int,	dst_nid			)
530286549dcSMel Gorman 	),
531286549dcSMel Gorman 
532286549dcSMel Gorman 	TP_fast_assign(
533286549dcSMel Gorman 		__entry->src_pid	= task_pid_nr(src_tsk);
534286549dcSMel Gorman 		__entry->src_tgid	= task_tgid_nr(src_tsk);
535286549dcSMel Gorman 		__entry->src_ngid	= task_numa_group_id(src_tsk);
536286549dcSMel Gorman 		__entry->src_cpu	= src_cpu;
537286549dcSMel Gorman 		__entry->src_nid	= cpu_to_node(src_cpu);
538286549dcSMel Gorman 		__entry->dst_pid	= task_pid_nr(dst_tsk);
539286549dcSMel Gorman 		__entry->dst_tgid	= task_tgid_nr(dst_tsk);
540286549dcSMel Gorman 		__entry->dst_ngid	= task_numa_group_id(dst_tsk);
541286549dcSMel Gorman 		__entry->dst_cpu	= dst_cpu;
542286549dcSMel Gorman 		__entry->dst_nid	= cpu_to_node(dst_cpu);
543286549dcSMel Gorman 	),
544286549dcSMel Gorman 
545286549dcSMel 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",
546286549dcSMel Gorman 			__entry->src_pid, __entry->src_tgid, __entry->src_ngid,
547286549dcSMel Gorman 			__entry->src_cpu, __entry->src_nid,
548286549dcSMel Gorman 			__entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid,
549286549dcSMel Gorman 			__entry->dst_cpu, __entry->dst_nid)
550286549dcSMel Gorman );
551dfc68f29SAndy Lutomirski 
552dfc68f29SAndy Lutomirski /*
553dfc68f29SAndy Lutomirski  * Tracepoint for waking a polling cpu without an IPI.
554dfc68f29SAndy Lutomirski  */
555dfc68f29SAndy Lutomirski TRACE_EVENT(sched_wake_idle_without_ipi,
556dfc68f29SAndy Lutomirski 
557dfc68f29SAndy Lutomirski 	TP_PROTO(int cpu),
558dfc68f29SAndy Lutomirski 
559dfc68f29SAndy Lutomirski 	TP_ARGS(cpu),
560dfc68f29SAndy Lutomirski 
561dfc68f29SAndy Lutomirski 	TP_STRUCT__entry(
562dfc68f29SAndy Lutomirski 		__field(	int,	cpu	)
563dfc68f29SAndy Lutomirski 	),
564dfc68f29SAndy Lutomirski 
565dfc68f29SAndy Lutomirski 	TP_fast_assign(
566dfc68f29SAndy Lutomirski 		__entry->cpu	= cpu;
567dfc68f29SAndy Lutomirski 	),
568dfc68f29SAndy Lutomirski 
569dfc68f29SAndy Lutomirski 	TP_printk("cpu=%d", __entry->cpu)
570dfc68f29SAndy Lutomirski );
571ea20d929SSteven Rostedt #endif /* _TRACE_SCHED_H */
572a8d154b0SSteven Rostedt 
573a8d154b0SSteven Rostedt /* This part must be outside protection */
574a8d154b0SSteven Rostedt #include <trace/define_trace.h>
575