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 25873a4009SWonhyuk 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) 34873a4009SWonhyuk Yang __field( int, req_cpu ) 35873a4009SWonhyuk Yang __field( int, cpu ) 36cdadf009STejun Heo ), 37cdadf009STejun Heo 38cdadf009STejun Heo TP_fast_assign( 39cdadf009STejun Heo __entry->work = work; 40cdadf009STejun Heo __entry->function = work->func; 41*2c92ca84SSteven Rostedt (Google) __assign_str(workqueue); 42cdadf009STejun Heo __entry->req_cpu = req_cpu; 43112202d9STejun Heo __entry->cpu = pwq->pool->cpu; 44cdadf009STejun Heo ), 45cdadf009STejun Heo 46873a4009SWonhyuk 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 ) 67d6a7bbddSKassey Li __field( void *, function) 68e8ab20d9SDaniel Jordan ), 69e8ab20d9SDaniel Jordan 70e8ab20d9SDaniel Jordan TP_fast_assign( 71e8ab20d9SDaniel Jordan __entry->work = work; 72d6a7bbddSKassey Li __entry->function = work->func; 73e8ab20d9SDaniel Jordan ), 74e8ab20d9SDaniel Jordan 75d6a7bbddSKassey Li TP_printk("work struct %p function=%ps ", __entry->work, __entry->function) 76cdadf009STejun Heo ); 77cdadf009STejun Heo 78cdadf009STejun Heo /** 79e36c886aSArjan van de Ven * workqueue_execute_start - called immediately before the workqueue callback 80e36c886aSArjan van de Ven * @work: pointer to struct work_struct 81e36c886aSArjan van de Ven * 82e36c886aSArjan van de Ven * Allows to track workqueue execution. 83e36c886aSArjan van de Ven */ 84e36c886aSArjan van de Ven TRACE_EVENT(workqueue_execute_start, 85e36c886aSArjan van de Ven 86e36c886aSArjan van de Ven TP_PROTO(struct work_struct *work), 87e36c886aSArjan van de Ven 88e36c886aSArjan van de Ven TP_ARGS(work), 89e36c886aSArjan van de Ven 90e36c886aSArjan van de Ven TP_STRUCT__entry( 91e36c886aSArjan van de Ven __field( void *, work ) 92e36c886aSArjan van de Ven __field( void *, function) 93e36c886aSArjan van de Ven ), 94e36c886aSArjan van de Ven 95e36c886aSArjan van de Ven TP_fast_assign( 96e36c886aSArjan van de Ven __entry->work = work; 97e36c886aSArjan van de Ven __entry->function = work->func; 98e36c886aSArjan van de Ven ), 99e36c886aSArjan van de Ven 100d75f773cSSakari Ailus TP_printk("work struct %p: function %ps", __entry->work, __entry->function) 101e36c886aSArjan van de Ven ); 102e36c886aSArjan van de Ven 103e36c886aSArjan van de Ven /** 104b3aa1584SStephen Boyd * workqueue_execute_end - called immediately after the workqueue callback 105e36c886aSArjan van de Ven * @work: pointer to struct work_struct 1061c5da0ecSDaniel Jordan * @function: pointer to worker function 107e36c886aSArjan van de Ven * 108e36c886aSArjan van de Ven * Allows to track workqueue execution. 109e36c886aSArjan van de Ven */ 1101c5da0ecSDaniel Jordan TRACE_EVENT(workqueue_execute_end, 111e36c886aSArjan van de Ven 1121c5da0ecSDaniel Jordan TP_PROTO(struct work_struct *work, work_func_t function), 113e36c886aSArjan van de Ven 1141c5da0ecSDaniel Jordan TP_ARGS(work, function), 1151c5da0ecSDaniel Jordan 1161c5da0ecSDaniel Jordan TP_STRUCT__entry( 1171c5da0ecSDaniel Jordan __field( void *, work ) 1181c5da0ecSDaniel Jordan __field( void *, function) 1191c5da0ecSDaniel Jordan ), 1201c5da0ecSDaniel Jordan 1211c5da0ecSDaniel Jordan TP_fast_assign( 1221c5da0ecSDaniel Jordan __entry->work = work; 1231c5da0ecSDaniel Jordan __entry->function = function; 1241c5da0ecSDaniel Jordan ), 1251c5da0ecSDaniel Jordan 1261c5da0ecSDaniel Jordan TP_printk("work struct %p: function %ps", __entry->work, __entry->function) 127e36c886aSArjan van de Ven ); 128e36c886aSArjan van de Ven 129e36c886aSArjan van de Ven #endif /* _TRACE_WORKQUEUE_H */ 130e36c886aSArjan van de Ven 131e36c886aSArjan van de Ven /* This part must be outside protection */ 132e36c886aSArjan van de Ven #include <trace/define_trace.h> 133