/**
  * workqueue_execute_end - called immediately after the workqueue callback
  * @work:      pointer to struct work_struct
+ * @function:   pointer to worker function
  *
  * Allows to track workqueue execution.
  */
-DEFINE_EVENT(workqueue_work, workqueue_execute_end,
+TRACE_EVENT(workqueue_execute_end,
 
-       TP_PROTO(struct work_struct *work),
+       TP_PROTO(struct work_struct *work, work_func_t function),
 
-       TP_ARGS(work)
+       TP_ARGS(work, function),
+
+       TP_STRUCT__entry(
+               __field( void *,        work    )
+               __field( void *,        function)
+       ),
+
+       TP_fast_assign(
+               __entry->work           = work;
+               __entry->function       = function;
+       ),
+
+       TP_printk("work struct %p: function %ps", __entry->work, __entry->function)
 );
 
 #endif /*  _TRACE_WORKQUEUE_H */
 
         * While we must be careful to not use "work" after this, the trace
         * point will only record its address.
         */
-       trace_workqueue_execute_end(work);
+       trace_workqueue_execute_end(work, worker->current_func);
        lock_map_release(&lockdep_map);
        lock_map_release(&pwq->wq->lockdep_map);