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