diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-probe.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 0584b7a0ed36..6b0e4cf322d8 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -59,6 +59,7 @@ static struct { | |||
59 | struct strlist *dellist; | 59 | struct strlist *dellist; |
60 | struct symbol_conf conf; | 60 | struct symbol_conf conf; |
61 | struct perf_session *psession; | 61 | struct perf_session *psession; |
62 | struct map *kmap; | ||
62 | } session; | 63 | } session; |
63 | 64 | ||
64 | 65 | ||
@@ -115,22 +116,26 @@ static int opt_del_probe_event(const struct option *opt __used, | |||
115 | return 0; | 116 | return 0; |
116 | } | 117 | } |
117 | 118 | ||
119 | /* Currently just checking function name from symbol map */ | ||
120 | static void evaluate_probe_point(struct probe_point *pp) | ||
121 | { | ||
122 | struct symbol *sym; | ||
123 | sym = map__find_symbol_by_name(session.kmap, pp->function, | ||
124 | session.psession, NULL); | ||
125 | if (!sym) | ||
126 | die("Kernel symbol \'%s\' not found - probe not added.", | ||
127 | pp->function); | ||
128 | } | ||
129 | |||
118 | #ifndef NO_LIBDWARF | 130 | #ifndef NO_LIBDWARF |
119 | static int open_vmlinux(void) | 131 | static int open_vmlinux(void) |
120 | { | 132 | { |
121 | struct map *kmap; | 133 | if (map__load(session.kmap, session.psession, NULL) < 0) { |
122 | kmap = map_groups__find_by_name(&session.psession->kmaps, | ||
123 | MAP__FUNCTION, "[kernel.kallsyms]"); | ||
124 | if (!kmap) { | ||
125 | pr_debug("Could not find kernel map.\n"); | ||
126 | return -ENOENT; | ||
127 | } | ||
128 | if (map__load(kmap, session.psession, NULL) < 0) { | ||
129 | pr_debug("Failed to load kernel map.\n"); | 134 | pr_debug("Failed to load kernel map.\n"); |
130 | return -EINVAL; | 135 | return -EINVAL; |
131 | } | 136 | } |
132 | pr_debug("Try to open %s\n", kmap->dso->long_name); | 137 | pr_debug("Try to open %s\n", session.kmap->dso->long_name); |
133 | return open(kmap->dso->long_name, O_RDONLY); | 138 | return open(session.kmap->dso->long_name, O_RDONLY); |
134 | } | 139 | } |
135 | #endif | 140 | #endif |
136 | 141 | ||
@@ -219,6 +224,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
219 | } | 224 | } |
220 | 225 | ||
221 | /* Initialize symbol maps for vmlinux */ | 226 | /* Initialize symbol maps for vmlinux */ |
227 | session.conf.sort_by_name = true; | ||
222 | if (session.conf.vmlinux_name == NULL) | 228 | if (session.conf.vmlinux_name == NULL) |
223 | session.conf.try_vmlinux_path = true; | 229 | session.conf.try_vmlinux_path = true; |
224 | if (symbol__init(&session.conf) < 0) | 230 | if (symbol__init(&session.conf) < 0) |
@@ -227,6 +233,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
227 | &session.conf); | 233 | &session.conf); |
228 | if (session.psession == NULL) | 234 | if (session.psession == NULL) |
229 | die("Failed to init perf_session."); | 235 | die("Failed to init perf_session."); |
236 | session.kmap = map_groups__find_by_name(&session.psession->kmaps, | ||
237 | MAP__FUNCTION, | ||
238 | "[kernel.kallsyms]"); | ||
239 | if (!session.kmap) | ||
240 | die("Could not find kernel map.\n"); | ||
230 | 241 | ||
231 | if (session.need_dwarf) | 242 | if (session.need_dwarf) |
232 | #ifdef NO_LIBDWARF | 243 | #ifdef NO_LIBDWARF |
@@ -277,6 +288,7 @@ end_dwarf: | |||
277 | if (pp->found) /* This probe is already found. */ | 288 | if (pp->found) /* This probe is already found. */ |
278 | continue; | 289 | continue; |
279 | 290 | ||
291 | evaluate_probe_point(pp); | ||
280 | ret = synthesize_trace_kprobe_event(pp); | 292 | ret = synthesize_trace_kprobe_event(pp); |
281 | if (ret == -E2BIG) | 293 | if (ret == -E2BIG) |
282 | die("probe point definition becomes too long."); | 294 | die("probe point definition becomes too long."); |