소스 검색

workqueue: prepare for more tracepoints

Define workqueue_work event class and use it for workqueue_execute_end
trace point.  Also, move trace/events/workqueue.h include downwards
such that all struct definitions are visible to it.  This is to
prepare for more tracepoints and doesn't cause any functional change.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Tejun Heo 14 년 전
부모
커밋
97bd234701
2개의 변경된 파일22개의 추가작업 그리고 16개의 파일을 삭제
  1. 19 13
      include/trace/events/workqueue.h
  2. 3 3
      kernel/workqueue.c

+ 19 - 13
include/trace/events/workqueue.h

@@ -7,13 +7,7 @@
 #include <linux/tracepoint.h>
 #include <linux/tracepoint.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 
 
-/**
- * workqueue_execute_start - called immediately before the workqueue callback
- * @work:	pointer to struct work_struct
- *
- * Allows to track workqueue execution.
- */
-TRACE_EVENT(workqueue_execute_start,
+DECLARE_EVENT_CLASS(workqueue_work,
 
 
 	TP_PROTO(struct work_struct *work),
 	TP_PROTO(struct work_struct *work),
 
 
@@ -21,24 +15,22 @@ TRACE_EVENT(workqueue_execute_start,
 
 
 	TP_STRUCT__entry(
 	TP_STRUCT__entry(
 		__field( void *,	work	)
 		__field( void *,	work	)
-		__field( void *,	function)
 	),
 	),
 
 
 	TP_fast_assign(
 	TP_fast_assign(
 		__entry->work		= work;
 		__entry->work		= work;
-		__entry->function	= work->func;
 	),
 	),
 
 
-	TP_printk("work struct %p: function %pf", __entry->work, __entry->function)
+	TP_printk("work struct %p", __entry->work)
 );
 );
 
 
 /**
 /**
- * workqueue_execute_end - called immediately before the workqueue callback
+ * workqueue_execute_start - called immediately before the workqueue callback
  * @work:	pointer to struct work_struct
  * @work:	pointer to struct work_struct
  *
  *
  * Allows to track workqueue execution.
  * Allows to track workqueue execution.
  */
  */
-TRACE_EVENT(workqueue_execute_end,
+TRACE_EVENT(workqueue_execute_start,
 
 
 	TP_PROTO(struct work_struct *work),
 	TP_PROTO(struct work_struct *work),
 
 
@@ -46,15 +38,29 @@ TRACE_EVENT(workqueue_execute_end,
 
 
 	TP_STRUCT__entry(
 	TP_STRUCT__entry(
 		__field( void *,	work	)
 		__field( void *,	work	)
+		__field( void *,	function)
 	),
 	),
 
 
 	TP_fast_assign(
 	TP_fast_assign(
 		__entry->work		= work;
 		__entry->work		= work;
+		__entry->function	= work->func;
 	),
 	),
 
 
-	TP_printk("work struct %p", __entry->work)
+	TP_printk("work struct %p: function %pf", __entry->work, __entry->function)
 );
 );
 
 
+/**
+ * workqueue_execute_end - called immediately before the workqueue callback
+ * @work:	pointer to struct work_struct
+ *
+ * Allows to track workqueue execution.
+ */
+DEFINE_EVENT(workqueue_work, workqueue_execute_end,
+
+	TP_PROTO(struct work_struct *work),
+
+	TP_ARGS(work)
+);
 
 
 #endif /*  _TRACE_WORKQUEUE_H */
 #endif /*  _TRACE_WORKQUEUE_H */
 
 

+ 3 - 3
kernel/workqueue.c

@@ -42,9 +42,6 @@
 #include <linux/lockdep.h>
 #include <linux/lockdep.h>
 #include <linux/idr.h>
 #include <linux/idr.h>
 
 
-#define CREATE_TRACE_POINTS
-#include <trace/events/workqueue.h>
-
 #include "workqueue_sched.h"
 #include "workqueue_sched.h"
 
 
 enum {
 enum {
@@ -257,6 +254,9 @@ EXPORT_SYMBOL_GPL(system_long_wq);
 EXPORT_SYMBOL_GPL(system_nrt_wq);
 EXPORT_SYMBOL_GPL(system_nrt_wq);
 EXPORT_SYMBOL_GPL(system_unbound_wq);
 EXPORT_SYMBOL_GPL(system_unbound_wq);
 
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/workqueue.h>
+
 #define for_each_busy_worker(worker, i, pos, gcwq)			\
 #define for_each_busy_worker(worker, i, pos, gcwq)			\
 	for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)			\
 	for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)			\
 		hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry)
 		hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry)