Branch data Line data Source code
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 : 3 : 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 : 3 : 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 : 3 : 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 : 3 : 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 : 3 : 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>