diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-05-26 18:21:55 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-05-27 03:10:36 -0400 |
commit | 03f6316d32738ec5eda2e6f628c12d1c01e61a87 (patch) | |
tree | 636916b9a5e36853c5ff678f8be9905f3b524195 | |
parent | d8d1656ee15d3085e0085a87e70f9093a0a102c5 (diff) |
perf report: Only load text symbols from kallsyms
Just like we do for userspace when reading the symtab, reducing the
number of entries we insert on the symbols rbtree.
Before:
[acme@emilia ~]$ rm -f perf_report.perf ; perf record -o perf_report.perf perf stat perf report > /dev/null
Performance counter stats for 'perf':
218.138382 task clock ticks (msecs)
4 context switches (events)
8 CPU migrations (events)
2136 pagefaults (events)
32746212 CPU cycles (events) (scaled from 67.04%)
11961102 instructions (events) (scaled from 66.19%)
49841 cache references (events) (scaled from 21.96%)
13777 cache misses (events) (scaled from 21.98%)
Wall-clock time elapsed: 218.702477 msecs
[acme@emilia ~]$ perf report -i perf_report.perf | head
11.06 perf [.] 0x00000000000057cb /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: dso__find_symbol
9.15 perf [.] 0x00000000000056a0 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: dso__insert_symbol
8.72 perf [k] 0xffffffff8101b1d2 intel_pmu_enable_all
8.51 perf [.] 0x0000000000006672 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: thread__symbol_incnew
3.83 perf [k] 0xffffffff811cfc5a vsnprintf
3.40 perf [.] 0x0000000000005e33 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: hex
3.40 perf [.] 0x0000000000005ec7 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: hex2long
3.19 perf [k] 0xffffffff811ce1c1 number
2.77 perf [.] 0x0000000000006869 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: threads__findnew
2.77 perf [.] 0x000000000000fde3 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: rb_insert_color
[acme@emilia ~]$
After:
acme@emilia ~]$ rm -f perf_report.perf ; perf record -o perf_report.perf perf stat perf report > /dev/null
Performance counter stats for 'perf':
190.228511 task clock ticks (msecs)
4 context switches (events)
7 CPU migrations (events)
1625 pagefaults (events)
29578745 CPU cycles (events) (scaled from 66.92%)
10516914 instructions (events) (scaled from 66.47%)
44015 cache references (events) (scaled from 22.04%)
8248 cache misses (events) (scaled from 22.07%)
Wall-clock time elapsed: 190.816096 msecs
[acme@emilia ~]$ perf report -i perf_report.perf | head
15.99 perf [.] 0x00000000000057a9 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: dso__find_symbol
10.87 perf [.] 0x000000000000674d /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: thread__symbol_incnew
8.74 perf [k] 0xffffffff8101b1d2 intel_pmu_enable_all
5.54 perf [.] 0x0000000000005e42 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: hex
4.48 perf [.] 0x0000000000005ebe /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: hex2long
4.48 perf [k] 0xffffffff811cfba0 vsnprintf
3.84 perf [.] 0x00000000000056b4 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: dso__insert_symbol
3.62 perf [.] 0x00000000000068d0 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: threads__findnew
3.20 perf [k] 0xffffffff811ce0b3 number
2.56 perf [.] 0x0000000000006d78 /home/acme/git/linux-2.6-tip/Documentation/perf_counter/perf: __cmd_report
[acme@emilia ~]$
[ Impact: optimization ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20090526222155.GJ4424@ghostprotocols.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | Documentation/perf_counter/builtin-report.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/Documentation/perf_counter/builtin-report.c b/Documentation/perf_counter/builtin-report.c index c517483fd614..a55f15d7651d 100644 --- a/Documentation/perf_counter/builtin-report.c +++ b/Documentation/perf_counter/builtin-report.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <libelf.h> | 3 | #include <libelf.h> |
4 | #include <gelf.h> | 4 | #include <gelf.h> |
5 | #include <elf.h> | 5 | #include <elf.h> |
6 | #include <ctype.h> | ||
6 | 7 | ||
7 | #include "util/list.h" | 8 | #include "util/list.h" |
8 | #include "util/rbtree.h" | 9 | #include "util/rbtree.h" |
@@ -408,13 +409,20 @@ static int load_kallsyms(void) | |||
408 | 409 | ||
409 | int len = hex2long(line, &start); | 410 | int len = hex2long(line, &start); |
410 | 411 | ||
411 | len += 3; /* ' t ' */ | 412 | len++; |
412 | if (len >= line_len) | 413 | if (len + 2 >= line_len) |
414 | continue; | ||
415 | |||
416 | char symbol_type = line[len]; | ||
417 | /* | ||
418 | * We're interested only in code ('T'ext) | ||
419 | */ | ||
420 | if (toupper(symbol_type) != 'T') | ||
413 | continue; | 421 | continue; |
414 | /* | 422 | /* |
415 | * Well fix up the end later, when we have all sorted. | 423 | * Well fix up the end later, when we have all sorted. |
416 | */ | 424 | */ |
417 | struct symbol *sym = symbol__new(start, 0xdead, line + len); | 425 | struct symbol *sym = symbol__new(start, 0xdead, line + len + 2); |
418 | 426 | ||
419 | if (sym == NULL) | 427 | if (sym == NULL) |
420 | goto out_delete_dso; | 428 | goto out_delete_dso; |