xref: /linux-6.15/include/trace/events/workqueue.h (revision 2c92ca84)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e36c886aSArjan van de Ven #undef TRACE_SYSTEM
3e36c886aSArjan van de Ven #define TRACE_SYSTEM workqueue
4e36c886aSArjan van de Ven 
5e36c886aSArjan van de Ven #if !defined(_TRACE_WORKQUEUE_H) || defined(TRACE_HEADER_MULTI_READ)
6e36c886aSArjan van de Ven #define _TRACE_WORKQUEUE_H
7e36c886aSArjan van de Ven 
8e36c886aSArjan van de Ven #include <linux/tracepoint.h>
9e36c886aSArjan van de Ven #include <linux/workqueue.h>
10e36c886aSArjan van de Ven 
111cdae042SAhbong Chang struct pool_workqueue;
121cdae042SAhbong Chang 
13e36c886aSArjan van de Ven /**
14cdadf009STejun Heo  * workqueue_queue_work - called when a work gets queued
15cdadf009STejun Heo  * @req_cpu:	the requested cpu
16112202d9STejun Heo  * @pwq:	pointer to struct pool_workqueue
17cdadf009STejun Heo  * @work:	pointer to struct work_struct
18cdadf009STejun Heo  *
19cdadf009STejun Heo  * This event occurs when a work is queued immediately or once a
20cdadf009STejun Heo  * delayed work is actually queued on a workqueue (ie: once the delay
21cdadf009STejun Heo  * has been reached).
22cdadf009STejun Heo  */
23cdadf009STejun Heo TRACE_EVENT(workqueue_queue_work,
24cdadf009STejun Heo 
25873a4009SWonhyuk Yang 	TP_PROTO(int req_cpu, struct pool_workqueue *pwq,
26cdadf009STejun Heo 		 struct work_struct *work),
27cdadf009STejun Heo 
28112202d9STejun Heo 	TP_ARGS(req_cpu, pwq, work),
29cdadf009STejun Heo 
30cdadf009STejun Heo 	TP_STRUCT__entry(
31cdadf009STejun Heo 		__field( void *,	work	)
32cdadf009STejun Heo 		__field( void *,	function)
3383b62687SSteven Rostedt (VMware) 		__string( workqueue,	pwq->wq->name)
34873a4009SWonhyuk Yang 		__field( int,	req_cpu	)
35873a4009SWonhyuk Yang 		__field( int,	cpu	)
36cdadf009STejun Heo 	),
37cdadf009STejun Heo 
38cdadf009STejun Heo 	TP_fast_assign(
39cdadf009STejun Heo 		__entry->work		= work;
40cdadf009STejun Heo 		__entry->function	= work->func;
41*2c92ca84SSteven Rostedt (Google) 		__assign_str(workqueue);
42cdadf009STejun Heo 		__entry->req_cpu	= req_cpu;
43112202d9STejun Heo 		__entry->cpu		= pwq->pool->cpu;
44cdadf009STejun Heo 	),
45cdadf009STejun Heo 
46873a4009SWonhyuk Yang 	TP_printk("work struct=%p function=%ps workqueue=%s req_cpu=%d cpu=%d",
4783b62687SSteven Rostedt (VMware) 		  __entry->work, __entry->function, __get_str(workqueue),
48cdadf009STejun Heo 		  __entry->req_cpu, __entry->cpu)
49cdadf009STejun Heo );
50cdadf009STejun Heo 
51cdadf009STejun Heo /**
52cdadf009STejun Heo  * workqueue_activate_work - called when a work gets activated
53cdadf009STejun Heo  * @work:	pointer to struct work_struct
54cdadf009STejun Heo  *
55cdadf009STejun Heo  * This event occurs when a queued work is put on the active queue,
56cdadf009STejun Heo  * which happens immediately after queueing unless @max_active limit
57cdadf009STejun Heo  * is reached.
58cdadf009STejun Heo  */
59e8ab20d9SDaniel Jordan TRACE_EVENT(workqueue_activate_work,
60cdadf009STejun Heo 
61cdadf009STejun Heo 	TP_PROTO(struct work_struct *work),
62cdadf009STejun Heo 
63e8ab20d9SDaniel Jordan 	TP_ARGS(work),
64e8ab20d9SDaniel Jordan 
65e8ab20d9SDaniel Jordan 	TP_STRUCT__entry(
66e8ab20d9SDaniel Jordan 		__field( void *,	work	)
67d6a7bbddSKassey Li 		__field( void *,	function)
68e8ab20d9SDaniel Jordan 	),
69e8ab20d9SDaniel Jordan 
70e8ab20d9SDaniel Jordan 	TP_fast_assign(
71e8ab20d9SDaniel Jordan 		__entry->work		= work;
72d6a7bbddSKassey Li 		__entry->function	= work->func;
73e8ab20d9SDaniel Jordan 	),
74e8ab20d9SDaniel Jordan 
75d6a7bbddSKassey Li 	TP_printk("work struct %p function=%ps ", __entry->work, __entry->function)
76cdadf009STejun Heo );
77cdadf009STejun Heo 
78cdadf009STejun Heo /**
79e36c886aSArjan van de Ven  * workqueue_execute_start - called immediately before the workqueue callback
80e36c886aSArjan van de Ven  * @work:	pointer to struct work_struct
81e36c886aSArjan van de Ven  *
82e36c886aSArjan van de Ven  * Allows to track workqueue execution.
83e36c886aSArjan van de Ven  */
84e36c886aSArjan van de Ven TRACE_EVENT(workqueue_execute_start,
85e36c886aSArjan van de Ven 
86e36c886aSArjan van de Ven 	TP_PROTO(struct work_struct *work),
87e36c886aSArjan van de Ven 
88e36c886aSArjan van de Ven 	TP_ARGS(work),
89e36c886aSArjan van de Ven 
90e36c886aSArjan van de Ven 	TP_STRUCT__entry(
91e36c886aSArjan van de Ven 		__field( void *,	work	)
92e36c886aSArjan van de Ven 		__field( void *,	function)
93e36c886aSArjan van de Ven 	),
94e36c886aSArjan van de Ven 
95e36c886aSArjan van de Ven 	TP_fast_assign(
96e36c886aSArjan van de Ven 		__entry->work		= work;
97e36c886aSArjan van de Ven 		__entry->function	= work->func;
98e36c886aSArjan van de Ven 	),
99e36c886aSArjan van de Ven 
100d75f773cSSakari Ailus 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
101e36c886aSArjan van de Ven );
102e36c886aSArjan van de Ven 
103e36c886aSArjan van de Ven /**
104b3aa1584SStephen Boyd  * workqueue_execute_end - called immediately after the workqueue callback
105e36c886aSArjan van de Ven  * @work:	pointer to struct work_struct
1061c5da0ecSDaniel Jordan  * @function:   pointer to worker function
107e36c886aSArjan van de Ven  *
108e36c886aSArjan van de Ven  * Allows to track workqueue execution.
109e36c886aSArjan van de Ven  */
1101c5da0ecSDaniel Jordan TRACE_EVENT(workqueue_execute_end,
111e36c886aSArjan van de Ven 
1121c5da0ecSDaniel Jordan 	TP_PROTO(struct work_struct *work, work_func_t function),
113e36c886aSArjan van de Ven 
1141c5da0ecSDaniel Jordan 	TP_ARGS(work, function),
1151c5da0ecSDaniel Jordan 
1161c5da0ecSDaniel Jordan 	TP_STRUCT__entry(
1171c5da0ecSDaniel Jordan 		__field( void *,	work	)
1181c5da0ecSDaniel Jordan 		__field( void *,	function)
1191c5da0ecSDaniel Jordan 	),
1201c5da0ecSDaniel Jordan 
1211c5da0ecSDaniel Jordan 	TP_fast_assign(
1221c5da0ecSDaniel Jordan 		__entry->work		= work;
1231c5da0ecSDaniel Jordan 		__entry->function	= function;
1241c5da0ecSDaniel Jordan 	),
1251c5da0ecSDaniel Jordan 
1261c5da0ecSDaniel Jordan 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
127e36c886aSArjan van de Ven );
128e36c886aSArjan van de Ven 
129e36c886aSArjan van de Ven #endif /*  _TRACE_WORKQUEUE_H */
130e36c886aSArjan van de Ven 
131e36c886aSArjan van de Ven /* This part must be outside protection */
132e36c886aSArjan van de Ven #include <trace/define_trace.h>
133