diff options
author | Masami Hiramatsu <mhiramat@redhat.com> | 2009-12-15 10:32:33 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-15 14:22:04 -0500 |
commit | a128168d1e79e537d6666655e7771d973e9230e3 (patch) | |
tree | 73f8581954751bd9927182e3ac984d925faefade /tools/perf/util | |
parent | d761b08bff0a9b653f6bd248cea50322e7eccb14 (diff) |
perf probe: Check build-id of vmlinux
Check build-id of vmlinux by using functions in symbol.c.
This also exposes map__load() for getting vmlinux path,
and removes vmlinux path list in builtin-probe.c,
because symbol.c already has that. Checking build-id
prevents users to open old or different debuginfo from
current running kernel.
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: Jason Baron <jbaron@redhat.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20091215153232.17436.45539.stgit@dhcp-100-2-132.bos.redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/event.h | 2 | ||||
-rw-r--r-- | tools/perf/util/map.c | 14 |
2 files changed, 11 insertions, 5 deletions
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index a92e0b039a6a..8027309b0422 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
@@ -152,6 +152,8 @@ size_t map__fprintf(struct map *self, FILE *fp); | |||
152 | 152 | ||
153 | struct perf_session; | 153 | struct perf_session; |
154 | 154 | ||
155 | int map__load(struct map *self, struct perf_session *session, | ||
156 | symbol_filter_t filter); | ||
155 | struct symbol *map__find_symbol(struct map *self, struct perf_session *session, | 157 | struct symbol *map__find_symbol(struct map *self, struct perf_session *session, |
156 | u64 addr, symbol_filter_t filter); | 158 | u64 addr, symbol_filter_t filter); |
157 | struct symbol *map__find_symbol_by_name(struct map *self, const char *name, | 159 | struct symbol *map__find_symbol_by_name(struct map *self, const char *name, |
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 8b3dd467adb5..c4d55a0da2ea 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c | |||
@@ -104,12 +104,16 @@ void map__fixup_end(struct map *self) | |||
104 | 104 | ||
105 | #define DSO__DELETED "(deleted)" | 105 | #define DSO__DELETED "(deleted)" |
106 | 106 | ||
107 | static int map__load(struct map *self, struct perf_session *session, | 107 | int map__load(struct map *self, struct perf_session *session, |
108 | symbol_filter_t filter) | 108 | symbol_filter_t filter) |
109 | { | 109 | { |
110 | const char *name = self->dso->long_name; | 110 | const char *name = self->dso->long_name; |
111 | int nr = dso__load(self->dso, self, session, filter); | 111 | int nr; |
112 | 112 | ||
113 | if (dso__loaded(self->dso, self->type)) | ||
114 | return 0; | ||
115 | |||
116 | nr = dso__load(self->dso, self, session, filter); | ||
113 | if (nr < 0) { | 117 | if (nr < 0) { |
114 | if (self->dso->has_build_id) { | 118 | if (self->dso->has_build_id) { |
115 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | 119 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; |
@@ -147,7 +151,7 @@ static int map__load(struct map *self, struct perf_session *session, | |||
147 | struct symbol *map__find_symbol(struct map *self, struct perf_session *session, | 151 | struct symbol *map__find_symbol(struct map *self, struct perf_session *session, |
148 | u64 addr, symbol_filter_t filter) | 152 | u64 addr, symbol_filter_t filter) |
149 | { | 153 | { |
150 | if (!dso__loaded(self->dso, self->type) && map__load(self, session, filter) < 0) | 154 | if (map__load(self, session, filter) < 0) |
151 | return NULL; | 155 | return NULL; |
152 | 156 | ||
153 | return dso__find_symbol(self->dso, self->type, addr); | 157 | return dso__find_symbol(self->dso, self->type, addr); |
@@ -157,7 +161,7 @@ struct symbol *map__find_symbol_by_name(struct map *self, const char *name, | |||
157 | struct perf_session *session, | 161 | struct perf_session *session, |
158 | symbol_filter_t filter) | 162 | symbol_filter_t filter) |
159 | { | 163 | { |
160 | if (!dso__loaded(self->dso, self->type) && map__load(self, session, filter) < 0) | 164 | if (map__load(self, session, filter) < 0) |
161 | return NULL; | 165 | return NULL; |
162 | 166 | ||
163 | if (!dso__sorted_by_name(self->dso, self->type)) | 167 | if (!dso__sorted_by_name(self->dso, self->type)) |