summaryrefslogtreecommitdiffstats
path: root/include/trace/events/workqueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/trace/events/workqueue.h')
-rw-r--r--include/trace/events/workqueue.h123
1 files changed, 76 insertions, 47 deletions
diff --git a/include/trace/events/workqueue.h b/include/trace/events/workqueue.h
index d6c9744..7d49729 100644
--- a/include/trace/events/workqueue.h
+++ b/include/trace/events/workqueue.h
@@ -4,89 +4,118 @@
#if !defined(_TRACE_WORKQUEUE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_WORKQUEUE_H
-#include <linux/workqueue.h>
-#include <linux/sched.h>
#include <linux/tracepoint.h>
+#include <linux/workqueue.h>
-DECLARE_EVENT_CLASS(workqueue,
+DECLARE_EVENT_CLASS(workqueue_work,
- TP_PROTO(struct task_struct *wq_thread, struct work_struct *work),
+ TP_PROTO(struct work_struct *work),
- TP_ARGS(wq_thread, work),
+ TP_ARGS(work),
TP_STRUCT__entry(
- __array(char, thread_comm, TASK_COMM_LEN)
- __field(pid_t, thread_pid)
- __field(work_func_t, func)
+ __field( void *, work )
),
TP_fast_assign(
- memcpy(__entry->thread_comm, wq_thread->comm, TASK_COMM_LEN);
- __entry->thread_pid = wq_thread->pid;
- __entry->func = work->func;
+ __entry->work = work;
),
- TP_printk("thread=%s:%d func=%pf", __entry->thread_comm,
- __entry->thread_pid, __entry->func)
+ TP_printk("work struct %p", __entry->work)
);
-DEFINE_EVENT(workqueue, workqueue_insertion,
+/**
+ * workqueue_queue_work - called when a work gets queued
+ * @req_cpu: the requested cpu
+ * @cwq: pointer to struct cpu_workqueue_struct
+ * @work: pointer to struct work_struct
+ *
+ * This event occurs when a work is queued immediately or once a
+ * delayed work is actually queued on a workqueue (ie: once the delay
+ * has been reached).
+ */
+TRACE_EVENT(workqueue_queue_work,
+
+ TP_PROTO(unsigned int req_cpu, struct cpu_workqueue_struct *cwq,
+ struct work_struct *work),
+
+ TP_ARGS(req_cpu, cwq, work),
- TP_PROTO(struct task_struct *wq_thread, struct work_struct *work),
+ TP_STRUCT__entry(
+ __field( void *, work )
+ __field( void *, function)
+ __field( void *, workqueue)
+ __field( unsigned int, req_cpu )
+ __field( unsigned int, cpu )
+ ),
+
+ TP_fast_assign(
+ __entry->work = work;
+ __entry->function = work->func;
+ __entry->workqueue = cwq->wq;
+ __entry->req_cpu = req_cpu;
+ __entry->cpu = cwq->gcwq->cpu;
+ ),
- TP_ARGS(wq_thread, work)
+ TP_printk("work struct=%p function=%pf workqueue=%p req_cpu=%u cpu=%u",
+ __entry->work, __entry->function, __entry->workqueue,
+ __entry->req_cpu, __entry->cpu)
);
-DEFINE_EVENT(workqueue, workqueue_execution,
+/**
+ * workqueue_activate_work - called when a work gets activated
+ * @work: pointer to struct work_struct
+ *
+ * This event occurs when a queued work is put on the active queue,
+ * which happens immediately after queueing unless @max_active limit
+ * is reached.
+ */
+DEFINE_EVENT(workqueue_work, workqueue_activate_work,
- TP_PROTO(struct task_struct *wq_thread, struct work_struct *work),
+ TP_PROTO(struct work_struct *work),
- TP_ARGS(wq_thread, work)
+ TP_ARGS(work)
);
-/* Trace the creation of one workqueue thread on a cpu */
-TRACE_EVENT(workqueue_creation,
+/**
+ * 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,
- TP_PROTO(struct task_struct *wq_thread, int cpu),
+ TP_PROTO(struct work_struct *work),
- TP_ARGS(wq_thread, cpu),
+ TP_ARGS(work),
TP_STRUCT__entry(
- __array(char, thread_comm, TASK_COMM_LEN)
- __field(pid_t, thread_pid)
- __field(int, cpu)
+ __field( void *, work )
+ __field( void *, function)
),
TP_fast_assign(
- memcpy(__entry->thread_comm, wq_thread->comm, TASK_COMM_LEN);
- __entry->thread_pid = wq_thread->pid;
- __entry->cpu = cpu;
+ __entry->work = work;
+ __entry->function = work->func;
),
- TP_printk("thread=%s:%d cpu=%d", __entry->thread_comm,
- __entry->thread_pid, __entry->cpu)
+ TP_printk("work struct %p: function %pf", __entry->work, __entry->function)
);
-TRACE_EVENT(workqueue_destruction,
-
- TP_PROTO(struct task_struct *wq_thread),
-
- TP_ARGS(wq_thread),
-
- TP_STRUCT__entry(
- __array(char, thread_comm, TASK_COMM_LEN)
- __field(pid_t, thread_pid)
- ),
+/**
+ * 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_fast_assign(
- memcpy(__entry->thread_comm, wq_thread->comm, TASK_COMM_LEN);
- __entry->thread_pid = wq_thread->pid;
- ),
+ TP_PROTO(struct work_struct *work),
- TP_printk("thread=%s:%d", __entry->thread_comm, __entry->thread_pid)
+ TP_ARGS(work)
);
-#endif /* _TRACE_WORKQUEUE_H */
+#endif /* _TRACE_WORKQUEUE_H */
/* This part must be outside protection */
#include <trace/define_trace.h>
OpenPOWER on IntegriCloud