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