Currently the build-id only recorded for sampled location, but in
order to correctly view/annotate callchains it might need the
build-id's of callchains too.  I guess this choice was due to a
performance impact on the post-processing at perf record time.

Add a new option --buildid-callchain to record this info.

$ perf record -o xxx -g -- perf > /dev/null
$ perf buildid-list -i xxx
6ebcee76c4b04895598b4df86ec445c49fc137a2 
/lib/modules/3.18.6-1-ARCH/build/vmlinux
fc0759b71584d2513b04f1b530965a61b5e499e2 /usr/lib/ld-2.21.so

$ perf record -o yyy -g --buildid-callchain -- perf > /dev/null
$ perf buildid-list -i yyy
6ebcee76c4b04895598b4df86ec445c49fc137a2 
/lib/modules/3.18.6-1-ARCH/build/vmlinux
4235ae90856f98d2746529648a3339ebfa6ede43 
/home/namhyung/project/linux/tools/perf/perf
fc0759b71584d2513b04f1b530965a61b5e499e2 /usr/lib/ld-2.21.so
9ac81172d5ff96f40d984fe7c10073a98f1a6b2e /usr/lib/libc-2.21.so
864583bb881db1d260660a30a51b3f5022cd538b /usr/lib/libnuma.so.1.0.0

Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/builtin-record.c |  2 ++
 tools/perf/util/build-id.c  | 24 +++++++++++++++++++++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 5a2ff510b75b..a43b1d96714b 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -841,6 +841,8 @@ struct option __record_options[] = {
                    "Sample machine registers on interrupt"),
        OPT_BOOLEAN(0, "running-time", &record.opts.running_time,
                    "Record running/enabled time of read (:S) events"),
+       OPT_BOOLEAN(0, "buildid-callchain", &symbol_conf.use_callchain,
+                   "Record build-id of DSOs in callchain"),
        OPT_END()
 };
 
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index f7fb2587df69..401357f3425a 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -17,6 +17,7 @@
 #include "tool.h"
 #include "header.h"
 #include "vdso.h"
+#include "callchain.h"
 
 
 static bool no_buildid_cache;
@@ -24,13 +25,15 @@ static bool no_buildid_cache;
 int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,
                           union perf_event *event,
                           struct perf_sample *sample,
-                          struct perf_evsel *evsel __maybe_unused,
+                          struct perf_evsel *evsel,
                           struct machine *machine)
 {
        struct addr_location al;
        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
        struct thread *thread = machine__findnew_thread(machine, sample->pid,
                                                        sample->tid);
+       int err;
+       struct callchain_cursor_node *node;
 
        if (thread == NULL) {
                pr_err("problem processing %d event, skipping it.\n",
@@ -43,6 +46,25 @@ int build_id__mark_dso_hit(struct perf_tool *tool 
__maybe_unused,
        if (al.map != NULL)
                al.map->dso->hit = 1;
 
+       if (!symbol_conf.use_callchain)
+               return 0;
+
+       err = sample__resolve_callchain(sample, NULL, evsel, &al,
+                                       PERF_MAX_STACK_DEPTH);
+       if (err)
+               return err;
+
+       callchain_cursor_commit(&callchain_cursor);
+       node = callchain_cursor_current(&callchain_cursor);
+
+       while (node) {
+               if (node->map)
+                       node->map->dso->hit = 1;
+
+               callchain_cursor_advance(&callchain_cursor);
+               node = callchain_cursor_current(&callchain_cursor);
+       }
+
        return 0;
 }
 
-- 
2.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to