[tip:perfcounters/urgent] perf_counter tools: Fix vmlinux fallback when running on a different kernel

From: tip-bot for Ingo Molnar
Date: Sun Jun 21 2009 - 09:10:40 EST


Commit-ID: c1f47b454ce759d7b13604137a233cad4617e1e8
Gitweb: http://git.kernel.org/tip/c1f47b454ce759d7b13604137a233cad4617e1e8
Author: Ingo Molnar <mingo@xxxxxxx>
AuthorDate: Sun, 21 Jun 2009 13:58:51 +0200
Committer: Ingo Molnar <mingo@xxxxxxx>
CommitDate: Sun, 21 Jun 2009 13:58:51 +0200

perf_counter tools: Fix vmlinux fallback when running on a different kernel

Lucas De Marchi reported that perf report and perf annotate
displays mismatching profile if a perf.data is analyzed on
an older kernel - even if the correct vmlinux is specified
via the -k option.

The reason is the fallback path in util/symbol.c:dso__load_kernel():

int dso__load_kernel(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose)
{
int err = -1;

if (vmlinux)
err = dso__load_vmlinux(self, vmlinux, filter, verbose);

if (err)
err = dso__load_kallsyms(self, filter, verbose);

return err;
}

dso__load_vmlinux() returns negative on error, but on success it
returns the number of symbols loaded - which confuses the function
to load the kallsyms.

This is normally harmless, as reporting is usually performed on the
same kernel that is analyzed - but if there's a mismatch then we
load the wrong kallsyms and create a non-sensical symbol tree.

The fix is to only fall back to kallsyms on errors.

Reported-by: Lucas De Marchi <lucas.de.marchi@xxxxxxxxx>
Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Mike Galbraith <efault@xxxxxx>
Cc: Paul Mackerras <paulus@xxxxxxxxx>
Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@xxxxxxx>


---
tools/perf/util/symbol.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 86e1437..01b62fa 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -629,7 +629,7 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
if (vmlinux)
err = dso__load_vmlinux(self, vmlinux, filter, verbose);

- if (err)
+ if (err < 0)
err = dso__load_kallsyms(self, filter, verbose);

return err;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/