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=%ps 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 %ps", __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> 125