1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2e36c886aSArjan van de Ven #undef TRACE_SYSTEM 3e36c886aSArjan van de Ven #define TRACE_SYSTEM workqueue 4e36c886aSArjan van de Ven 5e36c886aSArjan van de Ven #if !defined(_TRACE_WORKQUEUE_H) || defined(TRACE_HEADER_MULTI_READ) 6e36c886aSArjan van de Ven #define _TRACE_WORKQUEUE_H 7e36c886aSArjan van de Ven 8e36c886aSArjan van de Ven #include <linux/tracepoint.h> 9e36c886aSArjan van de Ven #include <linux/workqueue.h> 10e36c886aSArjan van de Ven 111cdae042SAhbong Chang struct pool_workqueue; 121cdae042SAhbong Chang 13e36c886aSArjan van de Ven /** 14cdadf009STejun Heo * workqueue_queue_work - called when a work gets queued 15cdadf009STejun Heo * @req_cpu: the requested cpu 16112202d9STejun Heo * @pwq: pointer to struct pool_workqueue 17cdadf009STejun Heo * @work: pointer to struct work_struct 18cdadf009STejun Heo * 19cdadf009STejun Heo * This event occurs when a work is queued immediately or once a 20cdadf009STejun Heo * delayed work is actually queued on a workqueue (ie: once the delay 21cdadf009STejun Heo * has been reached). 22cdadf009STejun Heo */ 23cdadf009STejun Heo TRACE_EVENT(workqueue_queue_work, 24cdadf009STejun Heo 25*873a4009SWonhyuk Yang TP_PROTO(int req_cpu, struct pool_workqueue *pwq, 26cdadf009STejun Heo struct work_struct *work), 27cdadf009STejun Heo 28112202d9STejun Heo TP_ARGS(req_cpu, pwq, work), 29cdadf009STejun Heo 30cdadf009STejun Heo TP_STRUCT__entry( 31cdadf009STejun Heo __field( void *, work ) 32cdadf009STejun Heo __field( void *, function) 3383b62687SSteven Rostedt (VMware) __string( workqueue, pwq->wq->name) 34*873a4009SWonhyuk Yang __field( int, req_cpu ) 35*873a4009SWonhyuk Yang __field( int, cpu ) 36cdadf009STejun Heo ), 37cdadf009STejun Heo 38cdadf009STejun Heo TP_fast_assign( 39cdadf009STejun Heo __entry->work = work; 40cdadf009STejun Heo __entry->function = work->func; 4183b62687SSteven Rostedt (VMware) __assign_str(workqueue, pwq->wq->name); 42cdadf009STejun Heo __entry->req_cpu = req_cpu; 43112202d9STejun Heo __entry->cpu = pwq->pool->cpu; 44cdadf009STejun Heo ), 45cdadf009STejun Heo 46*873a4009SWonhyuk Yang TP_printk("work struct=%p function=%ps workqueue=%s req_cpu=%d cpu=%d", 4783b62687SSteven Rostedt (VMware) __entry->work, __entry->function, __get_str(workqueue), 48cdadf009STejun Heo __entry->req_cpu, __entry->cpu) 49cdadf009STejun Heo ); 50cdadf009STejun Heo 51cdadf009STejun Heo /** 52cdadf009STejun Heo * workqueue_activate_work - called when a work gets activated 53cdadf009STejun Heo * @work: pointer to struct work_struct 54cdadf009STejun Heo * 55cdadf009STejun Heo * This event occurs when a queued work is put on the active queue, 56cdadf009STejun Heo * which happens immediately after queueing unless @max_active limit 57cdadf009STejun Heo * is reached. 58cdadf009STejun Heo */ 59e8ab20d9SDaniel Jordan TRACE_EVENT(workqueue_activate_work, 60cdadf009STejun Heo 61cdadf009STejun Heo TP_PROTO(struct work_struct *work), 62cdadf009STejun Heo 63e8ab20d9SDaniel Jordan TP_ARGS(work), 64e8ab20d9SDaniel Jordan 65e8ab20d9SDaniel Jordan TP_STRUCT__entry( 66e8ab20d9SDaniel Jordan __field( void *, work ) 67e8ab20d9SDaniel Jordan ), 68e8ab20d9SDaniel Jordan 69e8ab20d9SDaniel Jordan TP_fast_assign( 70e8ab20d9SDaniel Jordan __entry->work = work; 71e8ab20d9SDaniel Jordan ), 72e8ab20d9SDaniel Jordan 73e8ab20d9SDaniel Jordan TP_printk("work struct %p", __entry->work) 74cdadf009STejun Heo ); 75cdadf009STejun Heo 76cdadf009STejun Heo /** 77e36c886aSArjan van de Ven * workqueue_execute_start - called immediately before the workqueue callback 78e36c886aSArjan van de Ven * @work: pointer to struct work_struct 79e36c886aSArjan van de Ven * 80e36c886aSArjan van de Ven * Allows to track workqueue execution. 81e36c886aSArjan van de Ven */ 82e36c886aSArjan van de Ven TRACE_EVENT(workqueue_execute_start, 83e36c886aSArjan van de Ven 84e36c886aSArjan van de Ven TP_PROTO(struct work_struct *work), 85e36c886aSArjan van de Ven 86e36c886aSArjan van de Ven TP_ARGS(work), 87e36c886aSArjan van de Ven 88e36c886aSArjan van de Ven TP_STRUCT__entry( 89e36c886aSArjan van de Ven __field( void *, work ) 90e36c886aSArjan van de Ven __field( void *, function) 91e36c886aSArjan van de Ven ), 92e36c886aSArjan van de Ven 93e36c886aSArjan van de Ven TP_fast_assign( 94e36c886aSArjan van de Ven __entry->work = work; 95e36c886aSArjan van de Ven __entry->function = work->func; 96e36c886aSArjan van de Ven ), 97e36c886aSArjan van de Ven 98d75f773cSSakari Ailus TP_printk("work struct %p: function %ps", __entry->work, __entry->function) 99e36c886aSArjan van de Ven ); 100e36c886aSArjan van de Ven 101e36c886aSArjan van de Ven /** 102b3aa1584SStephen Boyd * workqueue_execute_end - called immediately after the workqueue callback 103e36c886aSArjan van de Ven * @work: pointer to struct work_struct 1041c5da0ecSDaniel Jordan * @function: pointer to worker function 105e36c886aSArjan van de Ven * 106e36c886aSArjan van de Ven * Allows to track workqueue execution. 107e36c886aSArjan van de Ven */ 1081c5da0ecSDaniel Jordan TRACE_EVENT(workqueue_execute_end, 109e36c886aSArjan van de Ven 1101c5da0ecSDaniel Jordan TP_PROTO(struct work_struct *work, work_func_t function), 111e36c886aSArjan van de Ven 1121c5da0ecSDaniel Jordan TP_ARGS(work, function), 1131c5da0ecSDaniel Jordan 1141c5da0ecSDaniel Jordan TP_STRUCT__entry( 1151c5da0ecSDaniel Jordan __field( void *, work ) 1161c5da0ecSDaniel Jordan __field( void *, function) 1171c5da0ecSDaniel Jordan ), 1181c5da0ecSDaniel Jordan 1191c5da0ecSDaniel Jordan TP_fast_assign( 1201c5da0ecSDaniel Jordan __entry->work = work; 1211c5da0ecSDaniel Jordan __entry->function = function; 1221c5da0ecSDaniel Jordan ), 1231c5da0ecSDaniel Jordan 1241c5da0ecSDaniel Jordan TP_printk("work struct %p: function %ps", __entry->work, __entry->function) 125e36c886aSArjan van de Ven ); 126e36c886aSArjan van de Ven 127e36c886aSArjan van de Ven #endif /* _TRACE_WORKQUEUE_H */ 128e36c886aSArjan van de Ven 129e36c886aSArjan van de Ven /* This part must be outside protection */ 130e36c886aSArjan van de Ven #include <trace/define_trace.h> 131