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 /tools/perf/builtin-buildid-list.c | |
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>
Diffstat (limited to 'tools/perf/builtin-buildid-list.c')
-rw-r--r-- | tools/perf/builtin-buildid-list.c | 35 |
1 files changed, 34 insertions, 1 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; |