aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorMike Galbraith <efault@gmx.de>2009-09-23 05:20:58 -0400
committerIngo Molnar <mingo@elte.hu>2009-09-23 07:45:48 -0400
commit508c4d0874acf8584787bbab7e4a3798e2834c1a (patch)
tree31af0531c1c74d4d64ad3ed6a6527db5458feceb /tools/perf
parent7d42896628202a551ad1107697cd215dc5fca099 (diff)
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: Avi Kivity <avi@redhat.com> Signed-off-by: Mike 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: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/util/symbol.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index fd3d9c8e90fc..559fb06210f5 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -833,7 +833,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v)
833 struct mod_dso *mods = mod_dso__new_dso("modules"); 833 struct mod_dso *mods = mod_dso__new_dso("modules");
834 struct module *pos; 834 struct module *pos;
835 struct rb_node *next; 835 struct rb_node *next;
836 int err; 836 int err, count = 0;
837 837
838 err = mod_dso__load_modules(mods); 838 err = mod_dso__load_modules(mods);
839 839
@@ -852,14 +852,16 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v)
852 break; 852 break;
853 853
854 next = rb_next(&pos->rb_node); 854 next = rb_next(&pos->rb_node);
855 count += err;
855 } 856 }
856 857
857 if (err < 0) { 858 if (err < 0) {
858 mod_dso__delete_modules(mods); 859 mod_dso__delete_modules(mods);
859 mod_dso__delete_self(mods); 860 mod_dso__delete_self(mods);
861 return err;
860 } 862 }
861 863
862 return err; 864 return count;
863} 865}
864 866
865static inline void dso__fill_symbol_holes(struct dso *self) 867static inline void dso__fill_symbol_holes(struct dso *self)
@@ -913,8 +915,15 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
913 915
914 if (vmlinux) { 916 if (vmlinux) {
915 err = dso__load_vmlinux(self, vmlinux, filter, v); 917 err = dso__load_vmlinux(self, vmlinux, filter, v);
916 if (err > 0 && use_modules) 918 if (err > 0 && use_modules) {
917 err = dso__load_modules(self, filter, v); 919 int syms = dso__load_modules(self, filter, v);
920
921 if (syms < 0) {
922 fprintf(stderr, "dso__load_modules failed!\n");
923 return syms;
924 }
925 err += syms;
926 }
918 } 927 }
919 928
920 if (err <= 0) 929 if (err <= 0)