diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-01-14 20:45:30 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-01-16 04:58:49 -0500 |
commit | 88d3d9b7c843a42cb73c55a2d13cd1041da31fb9 (patch) | |
tree | 65405bd819476046cda93ac1ccda8cca39becab4 | |
parent | 59ee68ecd1561a233fb6ad351980bea8402533e7 (diff) |
perf buildid-list: Introduce --with-hits option
Using this option 'perf buildid-list' will process all samples,
marking the DSOs that had some hits to list just them.
This in turn will be used by a new porcelain, 'perf archive',
that will be just a shell script to create a tarball from the
'perf buildid-list --with-hits' output and the files cached by
'perf record' in ~/.debug.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1263519930-22803-4-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | tools/perf/builtin-buildid-list.c | 35 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 11 | ||||
-rw-r--r-- | tools/perf/util/symbol.h | 3 |
3 files changed, 43 insertions, 6 deletions
diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c index 4229c2c213cc..431f204bde64 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | static char const *input_name = "perf.data"; | 17 | static char const *input_name = "perf.data"; |
18 | static int force; | 18 | static int force; |
19 | static bool with_hits; | ||
19 | 20 | ||
20 | static const char * const buildid_list_usage[] = { | 21 | static const char * const buildid_list_usage[] = { |
21 | "perf buildid-list [<options>]", | 22 | "perf buildid-list [<options>]", |
@@ -23,6 +24,7 @@ static const char * const buildid_list_usage[] = { | |||
23 | }; | 24 | }; |
24 | 25 | ||
25 | static const struct option options[] = { | 26 | static const struct option options[] = { |
27 | OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"), | ||
26 | OPT_STRING('i', "input", &input_name, "file", | 28 | OPT_STRING('i', "input", &input_name, "file", |
27 | "input file name"), | 29 | "input file name"), |
28 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), | 30 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), |
@@ -31,6 +33,34 @@ static const struct option options[] = { | |||
31 | OPT_END() | 33 | OPT_END() |
32 | }; | 34 | }; |
33 | 35 | ||
36 | static int build_id_list__process_event(event_t *event, | ||
37 | struct perf_session *session) | ||
38 | { | ||
39 | struct addr_location al; | ||
40 | u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | ||
41 | struct thread *thread = perf_session__findnew(session, event->ip.pid); | ||
42 | |||
43 | if (thread == NULL) { | ||
44 | pr_err("problem processing %d event, skipping it.\n", | ||
45 | event->header.type); | ||
46 | return -1; | ||
47 | } | ||
48 | |||
49 | thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION, | ||
50 | event->ip.ip, &al); | ||
51 | |||
52 | if (al.map != NULL) | ||
53 | al.map->dso->hit = 1; | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | static struct perf_event_ops build_id_list__event_ops = { | ||
59 | .sample = build_id_list__process_event, | ||
60 | .mmap = event__process_mmap, | ||
61 | .fork = event__process_task, | ||
62 | }; | ||
63 | |||
34 | static int __cmd_buildid_list(void) | 64 | static int __cmd_buildid_list(void) |
35 | { | 65 | { |
36 | int err = -1; | 66 | int err = -1; |
@@ -40,7 +70,10 @@ static int __cmd_buildid_list(void) | |||
40 | if (session == NULL) | 70 | if (session == NULL) |
41 | return -1; | 71 | return -1; |
42 | 72 | ||
43 | dsos__fprintf_buildid(stdout); | 73 | if (with_hits) |
74 | perf_session__process_events(session, &build_id_list__event_ops); | ||
75 | |||
76 | dsos__fprintf_buildid(stdout, with_hits); | ||
44 | 77 | ||
45 | perf_session__delete(session); | 78 | perf_session__delete(session); |
46 | return err; | 79 | return err; |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 4267138c7bbe..a4e745934584 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -1716,22 +1716,25 @@ void dsos__fprintf(FILE *fp) | |||
1716 | __dsos__fprintf(&dsos__user, fp); | 1716 | __dsos__fprintf(&dsos__user, fp); |
1717 | } | 1717 | } |
1718 | 1718 | ||
1719 | static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp) | 1719 | static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp, |
1720 | bool with_hits) | ||
1720 | { | 1721 | { |
1721 | struct dso *pos; | 1722 | struct dso *pos; |
1722 | size_t ret = 0; | 1723 | size_t ret = 0; |
1723 | 1724 | ||
1724 | list_for_each_entry(pos, head, node) { | 1725 | list_for_each_entry(pos, head, node) { |
1726 | if (with_hits && !pos->hit) | ||
1727 | continue; | ||
1725 | ret += dso__fprintf_buildid(pos, fp); | 1728 | ret += dso__fprintf_buildid(pos, fp); |
1726 | ret += fprintf(fp, " %s\n", pos->long_name); | 1729 | ret += fprintf(fp, " %s\n", pos->long_name); |
1727 | } | 1730 | } |
1728 | return ret; | 1731 | return ret; |
1729 | } | 1732 | } |
1730 | 1733 | ||
1731 | size_t dsos__fprintf_buildid(FILE *fp) | 1734 | size_t dsos__fprintf_buildid(FILE *fp, bool with_hits) |
1732 | { | 1735 | { |
1733 | return (__dsos__fprintf_buildid(&dsos__kernel, fp) + | 1736 | return (__dsos__fprintf_buildid(&dsos__kernel, fp, with_hits) + |
1734 | __dsos__fprintf_buildid(&dsos__user, fp)); | 1737 | __dsos__fprintf_buildid(&dsos__user, fp, with_hits)); |
1735 | } | 1738 | } |
1736 | 1739 | ||
1737 | static struct dso *dsos__create_kernel(const char *vmlinux) | 1740 | static struct dso *dsos__create_kernel(const char *vmlinux) |
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 36b7c717f5ee..525085fd0735 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
@@ -97,6 +97,7 @@ struct dso { | |||
97 | u8 slen_calculated:1; | 97 | u8 slen_calculated:1; |
98 | u8 has_build_id:1; | 98 | u8 has_build_id:1; |
99 | u8 kernel:1; | 99 | u8 kernel:1; |
100 | u8 hit:1; | ||
100 | unsigned char origin; | 101 | unsigned char origin; |
101 | u8 sorted_by_name; | 102 | u8 sorted_by_name; |
102 | u8 loaded; | 103 | u8 loaded; |
@@ -129,7 +130,7 @@ struct perf_session; | |||
129 | int dso__load(struct dso *self, struct map *map, struct perf_session *session, | 130 | int dso__load(struct dso *self, struct map *map, struct perf_session *session, |
130 | symbol_filter_t filter); | 131 | symbol_filter_t filter); |
131 | void dsos__fprintf(FILE *fp); | 132 | void dsos__fprintf(FILE *fp); |
132 | size_t dsos__fprintf_buildid(FILE *fp); | 133 | size_t dsos__fprintf_buildid(FILE *fp, bool with_hits); |
133 | 134 | ||
134 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); | 135 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); |
135 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); | 136 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); |