All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lin Ming <ming.m.lin@intel.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] perf probe: Add fastpath to do lookup by function name
Date: Thu, 24 Mar 2011 16:38:43 +0800	[thread overview]
Message-ID: <1300955923.14111.29.camel@minggr.sh.intel.com> (raw)
In-Reply-To: <20110324075830.GA28885@elte.hu>

On Thu, 2011-03-24 at 15:58 +0800, Ingo Molnar wrote:
> * Lin Ming <ming.m.lin@intel.com> wrote:
> 
> > The vmlinux file may have thousands of CUs.
> > We can lookup function name from .debug_pubnames section
> > to avoid the slow loop on CUs.
> 
> Mind including before/after perf stat --repeat 10 results in the changelog, of 
> an affected command which got faster?


>From 611a823a34e655d47a80f92994b004391e2b244c Mon Sep 17 00:00:00 2001
From: Lin Ming <ming.m.lin@intel.com>
Date: Thu, 24 Mar 2011 23:22:24 +0800
Subject: [PATCH] perf probe: Add fastpath to do lookup by function name

The vmlinux file may have thousands of CUs.
We can lookup function name from .debug_pubnames section
to avoid the slow loop on CUs.

./perf stat -r 10 -- ./perf probe -k /home/mlin/vmlinux \
        -s /home/mlin/linux-2.6 \
	--line csum_partial_copy_to_user > tmp.log

before patch applied
=====================
        364.535892 task-clock-msecs         #      0.997 CPUs  
                 0 context-switches         #      0.000 M/sec 
                 0 CPU-migrations           #      0.000 M/sec 
            29,993 page-faults              #      0.082 M/sec 
       865,862,109 cycles                   #   2375.245 M/sec 
     1,255,259,630 instructions             #      1.450 IPC  
       252,400,884 branches                 #    692.390 M/sec 
         3,429,376 branch-misses            #      1.359 %     
         1,386,990 cache-references         #      3.805 M/sec 
           687,188 cache-misses             #      1.885 M/sec 

        0.365792170  seconds time elapsed  


after patch applied
=====================
         89.896405 task-clock-msecs         #      0.991 CPUs
                 1 context-switches         #      0.000 M/sec
                 0 CPU-migrations           #      0.000 M/sec
            10,145 page-faults              #      0.113 M/sec
       214,553,875 cycles                   #   2386.679 M/sec
       226,915,559 instructions             #      1.058 IPC
        44,536,614 branches                 #    495.422 M/sec
           613,074 branch-misses            #      1.377 %
           860,787 cache-references         #      9.575 M/sec
           442,380 cache-misses             #      4.921 M/sec

        0.090716032  seconds time elapsed


Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
 tools/perf/util/probe-finder.c |   38 ++++++++++++++++++++++++++++++++++++++
 tools/perf/util/probe-finder.h |    1 +
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 194f9e2..b2034c2 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1876,6 +1876,30 @@ static int find_line_range_by_func(struct line_finder *lf)
 	return param.retval;
 }
 
+static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data)
+{
+	struct line_finder *lf = data;
+	struct line_range *lr = lf->lr;
+
+	if (dwarf_offdie(dbg, gl->die_offset, &lf->sp_die)) {
+		if (dwarf_tag(&lf->sp_die) != DW_TAG_subprogram)
+			return DWARF_CB_OK;
+
+		if (die_compare_name(&lf->sp_die, lr->function)) {
+			if (!dwarf_offdie(dbg, gl->cu_offset, &lf->cu_die))
+				return DWARF_CB_OK;
+
+			if (lr->file && !cu_find_realpath(&lf->cu_die, lr->file))
+				return DWARF_CB_OK;
+
+			lf->found = 1;
+			return DWARF_CB_ABORT;
+		}
+	}
+
+	return DWARF_CB_OK;
+}
+
 int find_line_range(int fd, struct line_range *lr)
 {
 	struct line_finder lf = {.lr = lr, .found = 0};
@@ -1895,6 +1919,19 @@ int find_line_range(int fd, struct line_range *lr)
 		return -EBADF;
 	}
 
+	/* Fastpath: lookup by function name from .debug_pubnames section */
+	if (lr->function) {
+		struct dwarf_callback_param param = {.data = (void *)&lf, .retval = 0};
+
+		dwarf_getpubnames(dbg, pubname_search_cb, &lf, 0);
+		if (lf.found) {
+			lf.found = 0;
+			line_range_search_cb(&lf.sp_die, &param);
+			if (lf.found)
+				goto found;
+		}
+	}
+
 	/* Loop on CUs (Compilation Unit) */
 	while (!lf.found && ret >= 0) {
 		if (dwarf_nextcu(dbg, off, &noff, &cuhl, NULL, NULL, NULL) != 0)
@@ -1923,6 +1960,7 @@ int find_line_range(int fd, struct line_range *lr)
 		off = noff;
 	}
 
+found:
 	/* Store comp_dir */
 	if (lf.found) {
 		comp_dir = cu_get_comp_dir(&lf.cu_die);
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index beaefc3..4bc56a4 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -83,6 +83,7 @@ struct line_finder {
 	int			lno_s;		/* Start line number */
 	int			lno_e;		/* End line number */
 	Dwarf_Die		cu_die;		/* Current CU */
+	Dwarf_Die		sp_die;
 	int			found;
 };
 
-- 
1.7.2.3




  reply	other threads:[~2011-03-24  8:39 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-24 15:38 [PATCH] perf probe: Add fastpath to do lookup by function name Lin Ming
2011-03-24  7:58 ` Ingo Molnar
2011-03-24  8:38   ` Lin Ming [this message]
2011-03-24  8:47     ` Ingo Molnar
2011-03-24  9:08 ` Masami Hiramatsu
2011-03-24 13:47   ` Lin Ming
2011-03-24 14:09     ` [PATCH v2 -tip] " Lin Ming
2011-03-25  1:14       ` Masami Hiramatsu
2011-03-25  2:57         ` Arnaldo Carvalho de Melo
2011-03-25  6:33           ` Lin Ming
2011-03-25  8:30             ` Lin Ming

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=1300955923.14111.29.camel@minggr.sh.intel.com \
    --to=ming.m.lin@intel.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@elte.hu \
    /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.