提交 508c4d08 编写于 作者: M Mike Galbraith 提交者: Ingo Molnar

perf tools: Fix module symbol loading bug

Avi Kivity reported 'perf annotate' failures with modules, the
requested function was not annotated.

If there are no modules currently loaded, or the last module
scanned is not loaded, dso__load_modules() steps on the value from
dso__load_vmlinux(), so we happily load the kallsyms symbols on top
of what we've already loaded.

Fix that such that the total count of symbols loaded is returned.
Should module symbol load fail after parsing of vmlinux, is's a
hard failure, so do not silently fall-back to kallsyms.
Reported-by: NAvi Kivity <avi@redhat.com>
Signed-off-by: NMike Galbraith <efault@gmx.de>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: rostedt@goodmis.org
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
LKML-Reference: <1253697658.11461.36.camel@marge.simson.net>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 7d428966
...@@ -833,7 +833,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v) ...@@ -833,7 +833,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v)
struct mod_dso *mods = mod_dso__new_dso("modules"); struct mod_dso *mods = mod_dso__new_dso("modules");
struct module *pos; struct module *pos;
struct rb_node *next; struct rb_node *next;
int err; int err, count = 0;
err = mod_dso__load_modules(mods); err = mod_dso__load_modules(mods);
...@@ -852,14 +852,16 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v) ...@@ -852,14 +852,16 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v)
break; break;
next = rb_next(&pos->rb_node); next = rb_next(&pos->rb_node);
count += err;
} }
if (err < 0) { if (err < 0) {
mod_dso__delete_modules(mods); mod_dso__delete_modules(mods);
mod_dso__delete_self(mods); mod_dso__delete_self(mods);
return err;
} }
return err; return count;
} }
static inline void dso__fill_symbol_holes(struct dso *self) static inline void dso__fill_symbol_holes(struct dso *self)
...@@ -913,8 +915,15 @@ int dso__load_kernel(struct dso *self, const char *vmlinux, ...@@ -913,8 +915,15 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
if (vmlinux) { if (vmlinux) {
err = dso__load_vmlinux(self, vmlinux, filter, v); err = dso__load_vmlinux(self, vmlinux, filter, v);
if (err > 0 && use_modules) if (err > 0 && use_modules) {
err = dso__load_modules(self, filter, v); int syms = dso__load_modules(self, filter, v);
if (syms < 0) {
fprintf(stderr, "dso__load_modules failed!\n");
return syms;
}
err += syms;
}
} }
if (err <= 0) if (err <= 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
新手
引导
客服 返回
顶部