mirror of https://gitee.com/openkylin/linux.git
perf probe: Unify show_available_functions for uprobes/kprobes
Unify show_available_functions for uprobes/kprobes to cleanup and reduce the code. This also improves error messages. Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: David Ahern <dsahern@gmail.com> Cc: "David A. Long" <dave.long@linaro.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: yrl.pp-manager.tt@hitachi.com Link: http://lkml.kernel.org/r/20140206053211.29635.20563.stgit@kbuild-fedora.yrl.intra.hitachi.co.jp Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
5a62257a3d
commit
2df58634cd
|
@ -2323,68 +2323,48 @@ static int filter_available_functions(struct map *map __maybe_unused,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int __show_available_funcs(struct map *map)
|
||||
int show_available_funcs(const char *target, struct strfilter *_filter,
|
||||
bool user)
|
||||
{
|
||||
if (map__load(map, filter_available_functions)) {
|
||||
pr_err("Failed to load map.\n");
|
||||
struct map *map;
|
||||
int ret;
|
||||
|
||||
ret = init_symbol_maps(user);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Get a symbol map */
|
||||
if (user)
|
||||
map = dso__new_map(target);
|
||||
else
|
||||
map = kernel_get_module_map(target);
|
||||
if (!map) {
|
||||
pr_err("Failed to get a map for %s\n", (target) ? : "kernel");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Load symbols with given filter */
|
||||
available_func_filter = _filter;
|
||||
if (map__load(map, filter_available_functions)) {
|
||||
pr_err("Failed to load symbols in %s\n", (target) ? : "kernel");
|
||||
goto end;
|
||||
}
|
||||
if (!dso__sorted_by_name(map->dso, map->type))
|
||||
dso__sort_by_name(map->dso, map->type);
|
||||
|
||||
/* Show all (filtered) symbols */
|
||||
setup_pager();
|
||||
dso__fprintf_symbols_by_name(map->dso, map->type, stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int available_kernel_funcs(const char *module)
|
||||
{
|
||||
struct map *map;
|
||||
int ret;
|
||||
|
||||
ret = init_symbol_maps(false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
map = kernel_get_module_map(module);
|
||||
if (!map) {
|
||||
pr_err("Failed to find %s map.\n", (module) ? : "kernel");
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = __show_available_funcs(map);
|
||||
exit_symbol_maps();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int available_user_funcs(const char *target)
|
||||
{
|
||||
struct map *map;
|
||||
int ret;
|
||||
|
||||
ret = init_symbol_maps(true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
map = dso__new_map(target);
|
||||
ret = __show_available_funcs(map);
|
||||
end:
|
||||
if (user) {
|
||||
dso__delete(map->dso);
|
||||
map__delete(map);
|
||||
}
|
||||
exit_symbol_maps();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int show_available_funcs(const char *target, struct strfilter *_filter,
|
||||
bool user)
|
||||
{
|
||||
setup_pager();
|
||||
available_func_filter = _filter;
|
||||
|
||||
if (!user)
|
||||
return available_kernel_funcs(target);
|
||||
|
||||
return available_user_funcs(target);
|
||||
}
|
||||
|
||||
/*
|
||||
* uprobe_events only accepts address:
|
||||
* Convert function and any offset to address
|
||||
|
|
Loading…
Reference in New Issue