Commit fbd733b8 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf symbols: Check vmlinux buildid

E.g.:

[root@doppio linux-2.6-tip]# perf top -v --vmlinux
../build/tip/vmlinux > /dev/null build_id in vmlinux is
e96699725a47413a50c231864a8e7a8ced40a31b while expected is
18e7cc53db62a7d35e9d6f6c9ddc23017d38ee9a, ignoring it

I.e. perf top was told to use a vmlinux file that is not the one
currently running on the machine, it ignores it and falls back
to using /proc/kallsyms.

This solves many, at first, mysterious results when people have
a stale vmlinux file while keeping the default of trying to use
the vmlinux file in the current directory in things like 'perf
annotate' where the DWARF info is required and thus we can't use
just /proc/kallsyms.

Modules buildids are already being checked as of the previous
changeset in this series, because we are using the default
dso__load routine, that will look at a series of places looking
for the best file with a matching buildid, starting in the
-debuginfo directories.
Signed-off-by: default avatarArnaldo 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: <1258757489-5978-5-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c338aee8
......@@ -1334,13 +1334,37 @@ static int kernel_maps__create_module_maps(void)
static int dso__load_vmlinux(struct dso *self, struct map *map,
const char *vmlinux, symbol_filter_t filter)
{
int err, fd = open(vmlinux, O_RDONLY);
int err = -1, fd;
self->loaded = 1;
if (self->has_build_id) {
u8 build_id[BUILD_ID_SIZE];
if (filename__read_build_id(vmlinux, build_id,
sizeof(build_id)) < 0) {
pr_debug("No build_id in %s, ignoring it\n", vmlinux);
return -1;
}
if (!dso__build_id_equal(self, build_id)) {
char expected_build_id[BUILD_ID_SIZE * 2 + 1],
vmlinux_build_id[BUILD_ID_SIZE * 2 + 1];
build_id__sprintf(self->build_id,
sizeof(self->build_id),
expected_build_id);
build_id__sprintf(build_id, sizeof(build_id),
vmlinux_build_id);
pr_debug("build_id in %s is %s while expected is %s, "
"ignoring it\n", vmlinux, vmlinux_build_id,
expected_build_id);
return -1;
}
}
fd = open(vmlinux, O_RDONLY);
if (fd < 0)
return -1;
self->loaded = 1;
err = dso__load_sym(self, map, self->long_name, fd, filter, 1, 0);
close(fd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment