xref: /linux/include/trace/events/workqueue.h (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM workqueue
4 
5 #if !defined(_TRACE_WORKQUEUE_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_WORKQUEUE_H
7 
8 #include <linux/tracepoint.h>
9 #include <linux/workqueue.h>
10 
11 struct pool_workqueue;
12 
13 /**
14  * workqueue_queue_work - called when a work gets queued
15  * @req_cpu:	the requested cpu
16  * @pwq:	pointer to struct pool_workqueue
17  * @work:	pointer to struct work_struct
18  *
19  * This event occurs when a work is queued immediately or once a
20  * delayed work is actually queued on a workqueue (ie: once the delay
21  * has been reached).
22  */
23 TRACE_EVENT(workqueue_queue_work,
24 
25 	TP_PROTO(int req_cpu, struct pool_workqueue *pwq,
26 		 struct work_struct *work),
27 
28 	TP_ARGS(req_cpu, pwq, work),
29 
30 	TP_STRUCT__entry(
31 		__field( void *,	work	)
32 		__field( void *,	function)
33 		__string( workqueue,	pwq->wq->name)
34 		__field( int,	req_cpu	)
35 		__field( int,	cpu	)
36 	),
37 
38 	TP_fast_assign(
39 		__entry->work		= work;
40 		__entry->function	= work->func;
41 		__assign_str(workqueue);
42 		__entry->req_cpu	= req_cpu;
43 		__entry->cpu		= pwq->pool->cpu;
44 	),
45 
46 	TP_printk("work struct=%p function=%ps workqueue=%s req_cpu=%d cpu=%d",
47 		  __entry->work, __entry->function, __get_str(workqueue),
48 		  __entry->req_cpu, __entry->cpu)
49 );
50 
51 /**
52  * workqueue_activate_work - called when a work gets activated
53  * @work:	pointer to struct work_struct
54  *
55  * This event occurs when a queued work is put on the active queue,
56  * which happens immediately after queueing unless @max_active limit
57  * is reached.
58  */
59 TRACE_EVENT(workqueue_activate_work,
60 
61 	TP_PROTO(struct work_struct *work),
62 
63 	TP_ARGS(work),
64 
65 	TP_STRUCT__entry(
66 		__field( void *,	work	)
67 		__field( void *,	function)
68 	),
69 
70 	TP_fast_assign(
71 		__entry->work		= work;
72 		__entry->function	= work->func;
73 	),
74 
75 	TP_printk("work struct %p function=%ps ", __entry->work, __entry->function)
76 );
77 
78 /**
79  * workqueue_execute_start - called immediately before the workqueue callback
80  * @work:	pointer to struct work_struct
81  *
82  * Allows to track workqueue execution.
83  */
84 TRACE_EVENT(workqueue_execute_start,
85 
86 	TP_PROTO(struct work_struct *work),
87 
88 	TP_ARGS(work),
89 
90 	TP_STRUCT__entry(
91 		__field( void *,	work	)
92 		__field( void *,	function)
93 	),
94 
95 	TP_fast_assign(
96 		__entry->work		= work;
97 		__entry->function	= work->func;
98 	),
99 
100 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
101 );
102 
103 /**
104  * workqueue_execute_end - called immediately after the workqueue callback
105  * @work:	pointer to struct work_struct
106  * @function:   pointer to worker function
107  *
108  * Allows to track workqueue execution.
109  */
110 TRACE_EVENT(workqueue_execute_end,
111 
112 	TP_PROTO(struct work_struct *work, work_func_t function),
113 
114 	TP_ARGS(work, function),
115 
116 	TP_STRUCT__entry(
117 		__field( void *,	work	)
118 		__field( void *,	function)
119 	),
120 
121 	TP_fast_assign(
122 		__entry->work		= work;
123 		__entry->function	= function;
124 	),
125 
126 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
127 );
128 
129 #endif /*  _TRACE_WORKQUEUE_H */
130 
131 /* This part must be outside protection */
132 #include <trace/define_trace.h>
133