From: Oleg Nesterov <oleg@redhat.com>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Andrew Morton <akpm@linux-foundation.org>,
Zhaolei <zhaolei@cn.fujitsu.com>,
Steven Rostedt <rostedt@goodmis.org>,
Tom Zanussi <tzanussi@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/1] ftrace, workqueuetrace: Make workqueuetracepoints use TRACE_EVENT macro
Date: Tue, 21 Apr 2009 17:28:43 +0200 [thread overview]
Message-ID: <20090421152843.GA5402@redhat.com> (raw)
In-Reply-To: <20090420234835.GC5997@nowhere>
On 04/21, Frederic Weisbecker wrote:
>
> On Tue, Apr 21, 2009 at 12:25:14AM +0200, Oleg Nesterov wrote:
> >
> > For example, I don't understand cpu_workqueue_stats->pid. Why it is
> > needed? Why can't we just record wq_thread itself? And if we copy
> > wq_thread->comm to cpu_workqueue_stats, we don't even need get/put
> > task_struct, afaics.
>
>
> We record the pid because of a race condition that can happen
> against the stat tracing framework.
>
> For example,
>
> - the user opens the stat file
> - then the entries are loaded and sorted into memory
> - one of the workqueues is destroyed
so, its pid is freed and can be re-used,
> - the user reads the file. We try to get the task struct
> of each workqueues that were recorded using their pid.
if it is already re-used when workqueue_stat_show() is called, we
can get a wrong a wrong tsk.
Another problem with pid_t, it needs a costly find_get_pid(). And please
note that find_get_pid() uses current->nsproxy->pid_ns, this means we
can get a wrong tsk or NULL if we read debugfs from sub-namespace, but
this is minor.
Using "struct pid* pid" is better than "pid_t pid" and solves these
problems. But I still think we don't need it at all.
> If the task is destroyed then this is fine, we don't get
> any struct. If we were using the task_struct as an identifier,
> me would have derefenced a freed pointer.
Please note I said "get/put task_struct" above. probe_workqueue_creation()
does get_task_struct(), and probe_workqueue_destruction() put_task_struct().
But, unless I missed something we don't need even this. Why do we
need to dereference this task_struct? The only reason afaics is
that we read tsk->comm. But we can copy wq_thread->comm to
cpu_workqueue_stats when probe_workqueue_creation() is called . In that
case we don't need get/put, we only use cws->task (or whatever) as a
"void *", just to check "if (node->task == wq_thread)" in
probe_workqueue_insertion/etc.
But it is very possible I missed something, please correct me.
> > probe_workqueue_destruction() does cpumask_first(cwq->cpus_allowed),
> > this doesn't look right. When workqueue_cpu_callback() calls
> > cleanup_workqueue_thread(), wq_thread is no longer affine to CPU it
> > was created on. This means probe_workqueue_destruction() can't always
> > find the correct cpu_workqueue_stats in workqueue_cpu_stat(cpu), no?
>
>
> Ah, at this stage of cpu_down() the cpu is cleared on
> tsk->cpu_allowed ?
Yes. Well not exactly...
More precisely, at this stage tsk->cpu_allowed is not bound, it has
"all CPUS", == cpu_possible_mask. This means that cpumask_first()
returns the "random" value. The fix is simple, I think you should
just add "int cpu" argument to cleanup_workqueue_thread().
Hmm... why cpu_workqueue_stats->inserted is atomic_t? We increment it
in do_workqueue_insertion() (should be static, no?), and it is always
called with cpu_workqueue_struct->lock held.
Oleg.
next prev parent reply other threads:[~2009-04-21 15:34 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 [this message]
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 ` [PATCH 4/4] workqueue_trace: Separate worklet_insertion into worklet_enqueue and worklet_enqueue_delayed Zhaolei
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=20090421152843.GA5402@redhat.com \
--to=oleg@redhat.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=rostedt@goodmis.org \
--cc=tzanussi@gmail.com \
--cc=zhaolei@cn.fujitsu.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.