aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2013-11-26 08:19:24 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-11-27 12:58:38 -0500
commit449867e346bfd52c5df6bba5b706a795c35e78d4 (patch)
tree113f5cab8fb92212630ff7a87597c39ad2ebd9c1
parentba1ddf42f3c3af111d3adee277534f73c1ef6a9b (diff)
perf symbols: Fix not finding kcore in buildid cache
The logic was not looking in the buildid cache for kcore if the host kernel buildid did not match the recorded kernel buildid. This affects the non-live case i.e. the kernel has changed and we are looking at a special copy of kcore that we placed in the buildid cache (using "perf buildid-cache -v -k /proc/kcore") when the data was recorded. After this fix kernel symbols get resolved/annotated correctly. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1385471964-4037-1-git-send-email-adrian.hunter@intel.com [ Added further explanation extracted from conversation between Ingo & Adrian on lkml ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/symbol.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index ce9ce101adf4..360eefecb81d 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1526,14 +1526,15 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
1526 1526
1527 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); 1527 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
1528 1528
1529 scnprintf(path, sizeof(path), "%s/[kernel.kcore]/%s", buildid_dir,
1530 sbuild_id);
1531
1529 /* Use /proc/kallsyms if possible */ 1532 /* Use /proc/kallsyms if possible */
1530 if (is_host) { 1533 if (is_host) {
1531 DIR *d; 1534 DIR *d;
1532 int fd; 1535 int fd;
1533 1536
1534 /* If no cached kcore go with /proc/kallsyms */ 1537 /* If no cached kcore go with /proc/kallsyms */
1535 scnprintf(path, sizeof(path), "%s/[kernel.kcore]/%s",
1536 buildid_dir, sbuild_id);
1537 d = opendir(path); 1538 d = opendir(path);
1538 if (!d) 1539 if (!d)
1539 goto proc_kallsyms; 1540 goto proc_kallsyms;
@@ -1558,6 +1559,10 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
1558 goto proc_kallsyms; 1559 goto proc_kallsyms;
1559 } 1560 }
1560 1561
1562 /* Find kallsyms in build-id cache with kcore */
1563 if (!find_matching_kcore(map, path, sizeof(path)))
1564 return strdup(path);
1565
1561 scnprintf(path, sizeof(path), "%s/[kernel.kallsyms]/%s", 1566 scnprintf(path, sizeof(path), "%s/[kernel.kallsyms]/%s",
1562 buildid_dir, sbuild_id); 1567 buildid_dir, sbuild_id);
1563 1568