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