From: Frederic Weisbecker <fweisbec@gmail.com>
To: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Cc: linux-kernel@vger.kernel.org, h.mitake@gmail.com,
Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Paul Mackerras <paulus@samba.org>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Jens Axboe <jens.axboe@oracle.com>,
Jason Baron <jbaron@redhat.com>,
Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Subject: Re: [PATCH v2] perf lock: add "info" subcommand for dumping misc information
Date: Fri, 30 Apr 2010 20:49:39 +0200 [thread overview]
Message-ID: <20100430184937.GB5357@nowhere> (raw)
In-Reply-To: <1272106001-10519-1-git-send-email-mitake@dcl.info.waseda.ac.jp>
On Sat, Apr 24, 2010 at 07:46:41PM +0900, Hitoshi Mitake wrote:
> Hi Frederic,
>
> I added "info" subcommand to perf lock,
> this can be used as dumping metadata like thread or address of lock instances.
> "map" was removed because info should do the work of it.
>
> This will be useful not only for debugging but also for ordinary analyzing.
>
> I made this patch on perf/core of your tree, could you queue this?
>
> v2: adding example of usage
> % sudo ./perf lock info -t
> | Thread ID: comm
> | 0: swapper
> | 1: init
> | 18: migration/5
> | 29: events/2
> | 32: events/5
> | 33: events/6
> ...
>
> % sudo ./perf lock info -m
> | Address of instance: name of class
> | 0xffff8800b95adae0: &(&sighand->siglock)->rlock
> | 0xffff8800bbb41ae0: &(&sighand->siglock)->rlock
> | 0xffff8800bf165ae0: &(&sighand->siglock)->rlock
> | 0xffff8800b9576a98: &p->cred_guard_mutex
> | 0xffff8800bb890a08: &(&p->alloc_lock)->rlock
> | 0xffff8800b9522a08: &(&p->alloc_lock)->rlock
> | 0xffff8800bb8aaa08: &(&p->alloc_lock)->rlock
> | 0xffff8800bba72a08: &(&p->alloc_lock)->rlock
> | 0xffff8800bf18ea08: &(&p->alloc_lock)->rlock
> | 0xffff8800b8a0d8a0: &(&ip->i_lock)->mr_lock
> | 0xffff88009bf818a0: &(&ip->i_lock)->mr_lock
> | 0xffff88004c66b8a0: &(&ip->i_lock)->mr_lock
> | 0xffff8800bb6478a0: &(shost->host_lock)->rlock
> Signed-off-by: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Jens Axboe <jens.axboe@oracle.com>
> Cc: Jason Baron <jbaron@redhat.com>
> Cc: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
I've eventually not queued it because of some various
problems, see below:
> ---
> tools/perf/builtin-lock.c | 68 +++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 65 insertions(+), 3 deletions(-)
>
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index ce27675..c54211e 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -778,18 +778,61 @@ static void print_result(void)
> }
> }
>
> +static int info_threads;
> +static int info_map;
> +
> +static void rec_dump_threads(struct rb_node *node)
> +{
> + struct thread_stat *st;
> + struct thread *t;
> +
> + if (!node)
> + return;
> +
> + if (node->rb_left)
> + rec_dump_threads(node->rb_left);
That only walks the left nodes of the rbtree, imagine the following
rbtree, W are visited nodes, U are the unvisited:
Root
/ \
W U
/ \ / \
W U U U
Better iterate using rb_first() then rb_next() until it is NULL.
> +
> + st = container_of(node, struct thread_stat, rb);
> + BUG_ON(!st);
You won't ever have !st because container_of computes an address
based on a struct type and a contained address inside this struct.
struct thread_stat {
struct list_head hash_entry;
struct rb_node rb;
[...]
} ts;
If ts->rb == 1000, ts == 1000 - 16 or something like this.
What matters is the "if (!node)" check you did before.
> + t = perf_session__findnew(session, st->tid);
> + BUG_ON(!t);
> +
> + printf("%10d: %s\n", st->tid, t->comm);
Please don't use printf anymore (I did the same mistakes lately),
now that are using a TUI and we might use a GUI one day, we
can't assume anymore we are dealing with a normal stdout.
So better use pr_debug, pr_err, pr_warning, etc...
> +
> + if (node->rb_right)
> + rec_dump_threads(node->rb_right);
> +}
> +
> +static void dump_threads(void)
> +{
> + printf("%10s: comm\n", "Thread ID");
Same here and below.
> + rec_dump_threads(thread_stats.rb_node);
> +}
> +
> static void dump_map(void)
> {
> unsigned int i;
> struct lock_stat *st;
>
> + printf("Address of instance: name of class\n");
> for (i = 0; i < LOCKHASH_SIZE; i++) {
> list_for_each_entry(st, &lockhash_table[i], hash_entry) {
> - printf("%p: %s\n", st->addr, st->name);
> + printf(" %p: %s\n", st->addr, st->name);
> }
> }
> }
>
> +static void dump_info(void)
> +{
> + /* ugly... */
> + if (info_threads)
> + dump_threads();
No it's not ugly, it's ok, we do this everywhere in perf tools :)
Thanks.
next prev parent reply other threads:[~2010-04-30 18:50 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-24 2:05 [GIT PULL] perf tools updates Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 1/9] perf lock: Fix state machine to recognize lock sequence Frederic Weisbecker
2010-04-24 10:43 ` [PATCH] perf lock: add "info" subcommand for dumping misc information Hitoshi Mitake
2010-04-24 10:46 ` Hitoshi Mitake
2010-04-24 10:46 ` [PATCH v2] " Hitoshi Mitake
2010-04-24 13:41 ` Frederic Weisbecker
2010-04-30 18:49 ` Frederic Weisbecker [this message]
2010-05-03 5:11 ` Hitoshi Mitake
2010-05-03 5:12 ` [PATCH v3] " Hitoshi Mitake
2010-05-05 21:10 ` Frederic Weisbecker
2010-05-06 9:31 ` Hitoshi Mitake
2010-05-06 9:32 ` [PATCH] perf lock: track only specified threads Hitoshi Mitake
2010-05-07 0:49 ` Frederic Weisbecker
2010-05-08 8:02 ` Hitoshi Mitake
2010-05-08 8:10 ` [PATCH] perf lock: Drop "-a" option from set of default arguments to cmd_record() Hitoshi Mitake
2010-05-08 16:14 ` Frederic Weisbecker
2010-05-09 14:53 ` Hitoshi Mitake
2010-05-11 6:48 ` Frederic Weisbecker
2010-05-12 10:23 ` Hitoshi Mitake
2010-05-12 15:51 ` Frederic Weisbecker
2010-05-15 8:54 ` Hitoshi Mitake
2010-05-10 7:19 ` [tip:perf/core] perf lock: Add "info" subcommand for dumping misc information tip-bot for Hitoshi Mitake
2010-04-24 2:05 ` [PATCH 2/9] perf: Fix initialization bug in parse_single_tracepoint_event() Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 3/9] perf: Generalize perf lock's sample event reordering to the session layer Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 4/9] perf: Use generic sample reordering in perf sched Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 5/9] perf: Use generic sample reordering in perf kmem Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 6/9] perf: Use generic sample reordering in perf trace Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 7/9] perf: Use generic sample reordering in perf timechart Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 8/9] perf: Add a perf trace option to check samples ordering reliability Frederic Weisbecker
2010-04-24 16:13 ` Masami Hiramatsu
2010-04-25 18:08 ` Frederic Weisbecker
2010-04-24 2:05 ` [PATCH 9/9] perf: Some perf-kvm documentation edits Frederic Weisbecker
2010-04-24 2:27 ` [GIT PULL] perf tools updates Frederic Weisbecker
2010-04-27 9:15 ` Ingo Molnar
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=20100430184937.GB5357@nowhere \
--to=fweisbec@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=h.mitake@gmail.com \
--cc=jbaron@redhat.com \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mitake@dcl.info.waseda.ac.jp \
--cc=paulus@samba.org \
--cc=xiaoguangrong@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.