diff options
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/probe-event.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index ee3f41eec5c1..b82d54fa2c56 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -117,6 +117,10 @@ static struct map *kernel_get_module_map(const char *module) | |||
117 | struct rb_node *nd; | 117 | struct rb_node *nd; |
118 | struct map_groups *grp = &machine.kmaps; | 118 | struct map_groups *grp = &machine.kmaps; |
119 | 119 | ||
120 | /* A file path -- this is an offline module */ | ||
121 | if (module && strchr(module, '/')) | ||
122 | return machine__new_module(&machine, 0, module); | ||
123 | |||
120 | if (!module) | 124 | if (!module) |
121 | module = "kernel"; | 125 | module = "kernel"; |
122 | 126 | ||
@@ -173,12 +177,19 @@ const char *kernel_get_module_path(const char *module) | |||
173 | /* Open new debuginfo of given module */ | 177 | /* Open new debuginfo of given module */ |
174 | static struct debuginfo *open_debuginfo(const char *module) | 178 | static struct debuginfo *open_debuginfo(const char *module) |
175 | { | 179 | { |
176 | const char *path = kernel_get_module_path(module); | 180 | const char *path; |
177 | 181 | ||
178 | if (!path) { | 182 | /* A file path -- this is an offline module */ |
179 | pr_err("Failed to find path of %s module.\n", | 183 | if (module && strchr(module, '/')) |
180 | module ?: "kernel"); | 184 | path = module; |
181 | return NULL; | 185 | else { |
186 | path = kernel_get_module_path(module); | ||
187 | |||
188 | if (!path) { | ||
189 | pr_err("Failed to find path of %s module.\n", | ||
190 | module ?: "kernel"); | ||
191 | return NULL; | ||
192 | } | ||
182 | } | 193 | } |
183 | return debuginfo__new(path); | 194 | return debuginfo__new(path); |
184 | } | 195 | } |
@@ -229,13 +240,36 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp, | |||
229 | static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, | 240 | static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, |
230 | int ntevs, const char *module) | 241 | int ntevs, const char *module) |
231 | { | 242 | { |
232 | int i; | 243 | int i, ret = 0; |
244 | char *tmp; | ||
245 | |||
246 | if (!module) | ||
247 | return 0; | ||
248 | |||
249 | tmp = strrchr(module, '/'); | ||
250 | if (tmp) { | ||
251 | /* This is a module path -- get the module name */ | ||
252 | module = strdup(tmp + 1); | ||
253 | if (!module) | ||
254 | return -ENOMEM; | ||
255 | tmp = strchr(module, '.'); | ||
256 | if (tmp) | ||
257 | *tmp = '\0'; | ||
258 | tmp = (char *)module; /* For free() */ | ||
259 | } | ||
260 | |||
233 | for (i = 0; i < ntevs; i++) { | 261 | for (i = 0; i < ntevs; i++) { |
234 | tevs[i].point.module = strdup(module); | 262 | tevs[i].point.module = strdup(module); |
235 | if (!tevs[i].point.module) | 263 | if (!tevs[i].point.module) { |
236 | return -ENOMEM; | 264 | ret = -ENOMEM; |
265 | break; | ||
266 | } | ||
237 | } | 267 | } |
238 | return 0; | 268 | |
269 | if (tmp) | ||
270 | free(tmp); | ||
271 | |||
272 | return ret; | ||
239 | } | 273 | } |
240 | 274 | ||
241 | /* Try to find perf_probe_event with debuginfo */ | 275 | /* Try to find perf_probe_event with debuginfo */ |