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, pwq->wq->name);
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 	),
68 
69 	TP_fast_assign(
70 		__entry->work		= work;
71 	),
72 
73 	TP_printk("work struct %p", __entry->work)
74 );
75 
76 /**
77  * workqueue_execute_start - called immediately before the workqueue callback
78  * @work:	pointer to struct work_struct
79  *
80  * Allows to track workqueue execution.
81  */
82 TRACE_EVENT(workqueue_execute_start,
83 
84 	TP_PROTO(struct work_struct *work),
85 
86 	TP_ARGS(work),
87 
88 	TP_STRUCT__entry(
89 		__field( void *,	work	)
90 		__field( void *,	function)
91 	),
92 
93 	TP_fast_assign(
94 		__entry->work		= work;
95 		__entry->function	= work->func;
96 	),
97 
98 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
99 );
100 
101 /**
102  * workqueue_execute_end - called immediately after the workqueue callback
103  * @work:	pointer to struct work_struct
104  * @function:   pointer to worker function
105  *
106  * Allows to track workqueue execution.
107  */
108 TRACE_EVENT(workqueue_execute_end,
109 
110 	TP_PROTO(struct work_struct *work, work_func_t function),
111 
112 	TP_ARGS(work, function),
113 
114 	TP_STRUCT__entry(
115 		__field( void *,	work	)
116 		__field( void *,	function)
117 	),
118 
119 	TP_fast_assign(
120 		__entry->work		= work;
121 		__entry->function	= function;
122 	),
123 
124 	TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
125 );
126 
127 #endif /*  _TRACE_WORKQUEUE_H */
128 
129 /* This part must be outside protection */
130 #include <trace/define_trace.h>
131