mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
perf probe: Fix --funcs to show correct symbols for offline module
Fix --funcs (-F) option to show correct symbols for offline module. Since previous perf-probe uses machine__findnew_module_map() for offline module, even if user passes a module file (with full path) which is for other architecture, perf-probe always tries to load symbol map for current kernel module. This fix uses dso__new_map() to load the map from given binary as same as a map for user applications. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/148350053478.19001.15435255244512631545.stgit@devbox Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
7934c98a6e
commit
eebc509b20
@ -163,7 +163,7 @@ static struct map *kernel_get_module_map(const char *module)
|
||||
|
||||
/* A file path -- this is an offline module */
|
||||
if (module && strchr(module, '/'))
|
||||
return machine__findnew_module_map(host_machine, 0, module);
|
||||
return dso__new_map(module);
|
||||
|
||||
if (!module)
|
||||
module = "kernel";
|
||||
@ -173,6 +173,7 @@ static struct map *kernel_get_module_map(const char *module)
|
||||
if (strncmp(pos->dso->short_name + 1, module,
|
||||
pos->dso->short_name_len - 2) == 0 &&
|
||||
module[pos->dso->short_name_len - 2] == '\0') {
|
||||
map__get(pos);
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
@ -188,15 +189,6 @@ struct map *get_target_map(const char *target, bool user)
|
||||
return kernel_get_module_map(target);
|
||||
}
|
||||
|
||||
static void put_target_map(struct map *map, bool user)
|
||||
{
|
||||
if (map && user) {
|
||||
/* Only the user map needs to be released */
|
||||
map__put(map);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int convert_exec_to_group(const char *exec, char **result)
|
||||
{
|
||||
char *ptr1, *ptr2, *exec_copy;
|
||||
@ -412,7 +404,7 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
|
||||
}
|
||||
|
||||
out:
|
||||
put_target_map(map, uprobes);
|
||||
map__put(map);
|
||||
return ret;
|
||||
|
||||
}
|
||||
@ -2869,7 +2861,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
|
||||
}
|
||||
|
||||
out:
|
||||
put_target_map(map, pev->uprobes);
|
||||
map__put(map);
|
||||
free(syms);
|
||||
return ret;
|
||||
|
||||
@ -3362,10 +3354,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,
|
||||
return ret;
|
||||
|
||||
/* Get a symbol map */
|
||||
if (user)
|
||||
map = dso__new_map(target);
|
||||
else
|
||||
map = kernel_get_module_map(target);
|
||||
map = get_target_map(target, user);
|
||||
if (!map) {
|
||||
pr_err("Failed to get a map for %s\n", (target) ? : "kernel");
|
||||
return -EINVAL;
|
||||
@ -3397,9 +3386,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,
|
||||
}
|
||||
|
||||
end:
|
||||
if (user) {
|
||||
map__put(map);
|
||||
}
|
||||
map__put(map);
|
||||
exit_probe_symbol_maps();
|
||||
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user