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(unsigned 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( unsigned int, req_cpu ) 35 __field( unsigned 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=%u cpu=%u", 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