Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf probe: Warn unmatched function filter correctly

Warn unmatched function filter correctly instead of warning
"symbol-loading error", since that can be a filter issue.

From the technical point of view, this adds a filter chech in map__load
and if there is a filter, it returns -2 (filter-out), instead of -1
(error), and perf-probe checks it and change message.

E.g. without this fix:

# perf probe -F rt_sp*
no symbols found in [kernel.kallsyms], maybe install a debug package?
Failed to load symbols in kernel

With this fix:

# perf probe -F rt_sp*
no symbols passed the given filter.
Failed to find symbols matched to "rt_sp*"
Error: Failed to show functions.

Reported-and-Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/146885835596.16106.2293540792775552481.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Masami Hiramatsu and committed by
Arnaldo Carvalho de Melo
e7049342 9a6c582d

+13 -2
+3
tools/perf/util/map.c
··· 312 312 pr_warning("%.*s was updated (is prelink enabled?). " 313 313 "Restart the long running apps that use it!\n", 314 314 (int)real_len, name); 315 + } else if (filter) { 316 + pr_warning("no symbols passed the given filter.\n"); 317 + return -2; /* Empty but maybe by the filter */ 315 318 } else { 316 319 pr_warning("no symbols found in %s, maybe install " 317 320 "a debug package?\n", name);
+10 -2
tools/perf/util/probe-event.c
··· 3312 3312 3313 3313 /* Load symbols with given filter */ 3314 3314 available_func_filter = _filter; 3315 - if (map__load(map, filter_available_functions)) { 3316 - pr_err("Failed to load symbols in %s\n", (target) ? : "kernel"); 3315 + ret = map__load(map, filter_available_functions); 3316 + if (ret) { 3317 + if (ret == -2) { 3318 + char *str = strfilter__string(_filter); 3319 + pr_err("Failed to find symbols matched to \"%s\"\n", 3320 + str); 3321 + free(str); 3322 + } else 3323 + pr_err("Failed to load symbols in %s\n", 3324 + (target) ? : "kernel"); 3317 3325 goto end; 3318 3326 } 3319 3327 if (!dso__sorted_by_name(map->dso, map->type))