From: Zhaolei <zhaolei@cn.fujitsu.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Tom Zanussi <tzanussi@gmail.com>,
linux-kernel@vger.kernel.org, Oleg Nesterov <oleg@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>
Subject: [PATCH 4/4] workqueue_trace: Separate worklet_insertion into worklet_enqueue and worklet_enqueue_delayed
Date: Fri, 24 Apr 2009 19:46:35 +0800 [thread overview]
Message-ID: <49F1A69B.9070206@cn.fujitsu.com> (raw)
In-Reply-To: <49F1A59B.3080206@cn.fujitsu.com>
To get more information about delayed work.
Suggest by Ingo Molnar <mingo@elte.hu>
> i'd suggest the following complete set of events instead:
> TRACE_EVENT(worklet_enqueue /* NEW */
> TRACE_EVENT(worklet_enqueue_delayed /* NEW */
> i'd suggest a 'cpu' parameter to the enqueue events, to allow the
> mapping of the _on(..cpu) variants too.
Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
---
include/trace/events/workqueue.h | 54 ++++++++++++++++++++++++++++++++-----
kernel/trace/trace_workqueue.c | 41 +++++++++++++++++++---------
kernel/workqueue.c | 19 ++++++++++---
3 files changed, 88 insertions(+), 26 deletions(-)
diff --git a/include/trace/events/workqueue.h b/include/trace/events/workqueue.h
index fb35cc7..e4c74f2 100644
--- a/include/trace/events/workqueue.h
+++ b/include/trace/events/workqueue.h
@@ -8,26 +8,64 @@
#undef TRACE_SYSTEM
#define TRACE_SYSTEM workqueue
-TRACE_EVENT(worklet_insertion,
+TRACE_EVENT(worklet_enqueue,
- TP_PROTO(struct task_struct *wq_thread, struct work_struct *work),
+ TP_PROTO(
+ struct task_struct *wq_thread,
+ struct work_struct *work,
+ int cpu
+ ),
- TP_ARGS(wq_thread, work),
+ TP_ARGS(wq_thread, work, cpu),
TP_STRUCT__entry(
- __array(char, thread_comm, TASK_COMM_LEN)
- __field(pid_t, thread_pid)
- __field(work_func_t, func)
+ __array(char, thread_comm, TASK_COMM_LEN)
+ __field(pid_t, thread_pid)
+ __field(work_func_t, func)
+ __field(int, cpu)
),
TP_fast_assign(
memcpy(__entry->thread_comm, wq_thread->comm, TASK_COMM_LEN);
__entry->thread_pid = wq_thread->pid;
__entry->func = work->func;
+ __entry->cpu = cpu;
+ ),
+
+ TP_printk("thread=%s:%d func=%pF cpu=%d", __entry->thread_comm,
+ __entry->thread_pid, __entry->func, __entry->cpu)
+);
+
+TRACE_EVENT(worklet_enqueue_delayed,
+
+ TP_PROTO(
+ struct task_struct *wq_thread,
+ struct work_struct *work,
+ int cpu,
+ unsigned long delay
+ ),
+
+ TP_ARGS(wq_thread, work, cpu, delay),
+
+ TP_STRUCT__entry(
+ __array(char, thread_comm, TASK_COMM_LEN)
+ __field(pid_t, thread_pid)
+ __field(work_func_t, func)
+ __field(int, cpu)
+ __field(unsigned long, delay)
+ ),
+
+ TP_fast_assign(
+ memcpy(__entry->thread_comm, wq_thread->comm, TASK_COMM_LEN);
+ __entry->thread_pid = wq_thread->pid;
+ __entry->func = work->func;
+ __entry->cpu = cpu;
+ __entry->delay = delay;
),
- TP_printk("thread=%s:%d func=%pF", __entry->thread_comm,
- __entry->thread_pid, __entry->func)
+ TP_printk("thread=%s:%d func=%pF cpu=%d delay=%lu",
+ __entry->thread_comm, __entry->thread_pid, __entry->func,
+ __entry->cpu, __entry->delay)
);
TRACE_EVENT(worklet_execute,
diff --git a/kernel/trace/trace_workqueue.c b/kernel/trace/trace_workqueue.c
index e3e1218..69ae4aa 100644
--- a/kernel/trace/trace_workqueue.c
+++ b/kernel/trace/trace_workqueue.c
@@ -57,7 +57,7 @@ static DEFINE_PER_CPU(struct workqueue_global_stats, all_workqueue_stat);
* Update record when insert a work into workqueue
* Caller need to hold cpu_workqueue_stats spin_lock
*/
-int do_worklet_insertion(struct cpu_workqueue_stats *cws,
+int do_worklet_enqueue(struct cpu_workqueue_stats *cws,
struct work_struct *work)
{
struct workfunc_stats *wfstat;
@@ -85,26 +85,34 @@ found:
return 0;
}
-/* Insertion of a work */
+/* Enqueue of a work */
static void
-probe_worklet_insertion(struct task_struct *wq_thread,
- struct work_struct *work)
+probe_worklet_enqueue(struct task_struct *wq_thread, struct work_struct *work,
+ int cpu)
{
- int cpu = cpumask_first(&wq_thread->cpus_allowed);
+ int wqcpu = cpumask_first(&wq_thread->cpus_allowed);
struct cpu_workqueue_stats *node;
unsigned long flags;
- spin_lock_irqsave(&workqueue_cpu_stat(cpu)->lock, flags);
- list_for_each_entry(node, &workqueue_cpu_stat(cpu)->list, list) {
+ spin_lock_irqsave(&workqueue_cpu_stat(wqcpu)->lock, flags);
+ list_for_each_entry(node, &workqueue_cpu_stat(wqcpu)->list, list) {
if (node->pid == wq_thread->pid) {
/* we ignore error of do_worklet_insertion */
- do_worklet_insertion(node, work);
+ do_worklet_enqueue(node, work);
goto found;
}
}
pr_debug("trace_workqueue: entry not found\n");
found:
- spin_unlock_irqrestore(&workqueue_cpu_stat(cpu)->lock, flags);
+ spin_unlock_irqrestore(&workqueue_cpu_stat(wqcpu)->lock, flags);
+}
+
+static void
+probe_worklet_enqueue_delayed(struct task_struct *wq_thread,
+ struct work_struct *work, int cpu,
+ unsigned long delay)
+{
+ probe_worklet_enqueue(wq_thread, work, cpu);
}
/* Execution of a work */
@@ -368,13 +376,18 @@ int __init trace_workqueue_early_init(void)
{
int ret, cpu;
- ret = register_trace_worklet_insertion(probe_worklet_insertion);
+ ret = register_trace_worklet_enqueue(probe_worklet_enqueue);
if (ret)
goto out;
+ ret = register_trace_worklet_enqueue_delayed(
+ probe_worklet_enqueue_delayed);
+ if (ret)
+ goto no_enqueue;
+
ret = register_trace_worklet_execute(probe_worklet_execute);
if (ret)
- goto no_insertion;
+ goto no_enqueue_delayed;
ret = register_trace_workqueue_creation(probe_workqueue_creation);
if (ret)
@@ -395,8 +408,10 @@ no_creation:
unregister_trace_workqueue_creation(probe_workqueue_creation);
no_handler_entry:
unregister_trace_worklet_execute(probe_worklet_execute);
-no_insertion:
- unregister_trace_worklet_insertion(probe_worklet_insertion);
+no_enqueue_delayed:
+ unregister_trace_worklet_enqueue_delayed(probe_worklet_enqueue_delayed);
+no_enqueue:
+ unregister_trace_worklet_enqueue(probe_worklet_enqueue);
out:
pr_warning("trace_workqueue: unable to trace workqueues\n");
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index a3c9848..0cc14b9 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -128,8 +128,6 @@ struct cpu_workqueue_struct *get_wq_data(struct work_struct *work)
static void insert_work(struct cpu_workqueue_struct *cwq,
struct work_struct *work, struct list_head *head)
{
- trace_worklet_insertion(cwq->thread, work);
-
set_wq_data(work, cwq);
/*
* Ensure that we get the right work->data if we see the
@@ -188,8 +186,12 @@ queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work)
int ret = 0;
if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
+ struct cpu_workqueue_struct *cwq;
+
BUG_ON(!list_empty(&work->entry));
- __queue_work(wq_per_cpu(wq, cpu), work);
+ cwq = wq_per_cpu(wq, cpu);
+ __queue_work(cwq, work);
+ trace_worklet_enqueue(cwq->thread, work, cpu);
ret = 1;
}
return ret;
@@ -251,10 +253,17 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
timer->data = (unsigned long)dwork;
timer->function = delayed_work_timer_fn;
- if (unlikely(cpu >= 0))
+ if (unlikely(cpu >= 0)) {
add_timer_on(timer, cpu);
- else
+ trace_worklet_enqueue_delayed(
+ wq_per_cpu(wq, cpu)->thread, work, cpu, delay);
+ } else {
add_timer(timer);
+ trace_worklet_enqueue_delayed(
+ wq_per_cpu(wq, raw_smp_processor_id())->thread,
+ work, cpu, delay);
+ }
+
ret = 1;
}
return ret;
--
1.5.5.3
next prev parent reply other threads:[~2009-04-24 11:47 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-13 0:53 [PATCH 0/1] tracing, workqueuetrace: Make workqueue tracepoints use TRACE_EVENT macro Zhaolei
2009-04-13 0:54 ` [PATCH 1/1] " Zhaolei
2009-04-13 1:44 ` KOSAKI Motohiro
2009-04-13 3:25 ` KOSAKI Motohiro
2009-04-13 3:49 ` Zhaolei
2009-04-13 3:57 ` Ingo Molnar
2009-04-13 4:07 ` Re: [PATCH 1/1] tracing, workqueuetrace: Make workqueuetracepoints " Zhaolei
2009-04-13 3:57 ` [PATCH 1/1] tracing, workqueuetrace: Make workqueue tracepoints " KOSAKI Motohiro
2009-04-13 5:52 ` [PATCH v2 1/4] ftrace, " KOSAKI Motohiro
2009-04-13 5:53 ` [PATCH v2 2/4] ftrace: introduce workqueue_handler_exit tracepoint and rename workqueue_execution to workqueue_handler_entry KOSAKI Motohiro
2009-04-13 16:25 ` Frederic Weisbecker
2009-04-15 10:22 ` Oleg Nesterov
2009-04-15 11:09 ` Ingo Molnar
2009-04-15 11:33 ` Oleg Nesterov
2009-04-15 11:45 ` Ingo Molnar
2009-04-15 12:05 ` Oleg Nesterov
2009-04-13 5:53 ` [PATCH v2 3/4] ftrace: add max execution time mesurement to workqueue tracer KOSAKI Motohiro
2009-04-13 16:16 ` Frederic Weisbecker
2009-04-13 21:21 ` Ingo Molnar
2009-04-14 1:43 ` KOSAKI Motohiro
2009-04-14 11:40 ` Frederic Weisbecker
2009-04-15 0:31 ` KOSAKI Motohiro
2009-04-13 5:55 ` [PATCH v2 4/4] ftrace: add latecy mesurement feature " KOSAKI Motohiro
2009-04-14 2:50 ` KOSAKI Motohiro
2009-04-13 15:24 ` [PATCH v2 1/4] ftrace, workqueuetrace: Make workqueue tracepoints use TRACE_EVENT macro Frederic Weisbecker
2009-04-14 4:03 ` [PATCH v2 5/4] ftrace, workqueuetrace: display work name KOSAKI Motohiro
2009-04-14 21:16 ` Frederic Weisbecker
2009-04-14 23:55 ` KOSAKI Motohiro
2009-04-15 1:15 ` Frederic Weisbecker
2009-04-15 6:13 ` KOSAKI Motohiro
2009-04-15 6:17 ` Zhaolei
2009-04-15 9:44 ` Ingo Molnar
2009-04-15 16:23 ` Frederic Weisbecker
2009-04-17 6:56 ` [PATCH v3 0/1] ftrace, workqueuetrace: Make workqueue tracepoints use TRACE_EVENT macro Zhaolei
2009-04-17 7:15 ` [PATCH v3 1/1] " Zhaolei
2009-04-17 13:45 ` Ingo Molnar
2009-04-20 1:30 ` [PATCH v3 1/1] ftrace, workqueuetrace: Make workqueuetracepoints " Zhaolei
2009-04-20 1:38 ` KOSAKI Motohiro
2009-04-20 1:43 ` Zhaolei
2009-04-20 1:49 ` KOSAKI Motohiro
2009-04-20 8:46 ` Ingo Molnar
2009-04-20 22:25 ` Oleg Nesterov
2009-04-20 23:48 ` Frederic Weisbecker
2009-04-21 15:28 ` Oleg Nesterov
2009-04-21 15:50 ` Oleg Nesterov
2009-04-21 18:33 ` Frederic Weisbecker
2009-04-21 18:28 ` Frederic Weisbecker
2009-04-21 19:37 ` Oleg Nesterov
2009-04-24 11:42 ` [PATCH 0/4] workqueue_tracepoint: Add worklet tracepoints for worklet lifecycle tracing Zhaolei
2009-04-24 11:43 ` [PATCH 1/4] workqueue_tracepoint: introduce workqueue_handler_exit tracepoint and rename workqueue_execution to workqueue_handler_entry Zhaolei
2009-04-24 11:45 ` [PATCH 2/4] workqueue_tracepoint: Add workqueue_flush and worklet_cancel tracepoint Zhaolei
2009-04-24 11:45 ` [PATCH 3/4] workqueue_tracepoint: Change tracepoint name to fit worklet and workqueue lifecycle Zhaolei
2009-04-24 11:46 ` Zhaolei [this message]
2009-04-24 20:06 ` [PATCH 0/4] workqueue_tracepoint: Add worklet tracepoints for worklet lifecycle tracing Andrew Morton
2009-04-24 22:59 ` Frederic Weisbecker
2009-04-24 23:20 ` Andrew Morton
2009-04-25 0:37 ` Frederic Weisbecker
2009-04-25 1:28 ` Andrew Morton
2009-04-25 2:00 ` Steven Rostedt
2009-04-25 2:24 ` Andrew Morton
2009-04-25 2:51 ` Steven Rostedt
2009-04-25 3:10 ` Andrew Morton
2009-04-25 3:32 ` Steven Rostedt
2009-04-26 10:47 ` Ingo Molnar
2009-04-27 5:44 ` Andrew Morton
2009-04-27 15:02 ` Oleg Nesterov
2009-04-27 15:43 ` Ingo Molnar
2009-04-27 19:09 ` Oleg Nesterov
2009-04-28 13:42 ` Frederic Weisbecker
2009-04-28 16:43 ` Oleg Nesterov
2009-04-28 17:49 ` Frederic Weisbecker
2009-04-24 23:27 ` Frederic Weisbecker
2009-04-28 17:24 ` Frank Ch. Eigler
2009-04-28 18:48 ` Andrew Morton
2009-04-28 20:51 ` Frank Ch. Eigler
2009-04-29 4:03 ` KOSAKI Motohiro
2009-04-29 4:29 ` Andrew Morton
2009-04-29 5:21 ` KOSAKI Motohiro
2009-04-20 17:11 ` [PATCH v3 1/1] ftrace, workqueuetrace: Make workqueue tracepoints use TRACE_EVENT macro Frederic Weisbecker
2009-04-21 1:20 ` KOSAKI Motohiro
2009-04-20 6:42 ` [PATCH 0/4] ftrace, workqueuetrace: Add worklet informationame Zhaolei
2009-04-20 6:58 ` [PATCH 1/4] trace_workqueue: use list_for_each_entry() instead of list_for_each_entry_safe() Zhaolei
2009-04-20 7:26 ` Frederic Weisbecker
2009-04-20 6:59 ` [PATCH 2/4] trace_workqueue: Remove cpu_workqueue_stats->first_entry Zhaolei
2009-04-20 7:02 ` [PATCH 3/4] trace_workqueue: Remove blank line between each cpu Zhaolei
2009-04-20 7:09 ` [PATCH 4/4] trace_workqueue: Add worklet information Zhaolei
2009-04-20 11:36 ` Frederic Weisbecker
2009-04-21 1:57 ` Zhaolei
2009-04-21 23:39 ` Frederic Weisbecker
2009-04-20 7:23 ` [PATCH 0/4] ftrace, workqueuetrace: Add worklet informationame Frederic Weisbecker
2009-04-13 14:34 ` [PATCH 1/1] tracing, workqueuetrace: Make workqueue tracepoints use TRACE_EVENT macro Frederic Weisbecker
2009-04-13 14:13 ` Frederic Weisbecker
2009-04-15 6:47 ` KOSAKI Motohiro
2009-04-13 13:57 ` [PATCH 0/1] " Frederic Weisbecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49F1A69B.9070206@cn.fujitsu.com \
--to=zhaolei@cn.fujitsu.com \
--cc=akpm@linux-foundation.org \
--cc=fweisbec@gmail.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=rostedt@goodmis.org \
--cc=tzanussi@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.