diff options
Diffstat (limited to 'tools/perf/builtin-probe.c')
-rw-r--r-- | tools/perf/builtin-probe.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index add163c9f0e7..2c0e64d0b4aa 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include "builtin.h" | 36 | #include "builtin.h" |
37 | #include "util/util.h" | 37 | #include "util/util.h" |
38 | #include "util/strlist.h" | 38 | #include "util/strlist.h" |
39 | #include "util/strfilter.h" | ||
39 | #include "util/symbol.h" | 40 | #include "util/symbol.h" |
40 | #include "util/debug.h" | 41 | #include "util/debug.h" |
41 | #include "util/debugfs.h" | 42 | #include "util/debugfs.h" |
@@ -43,6 +44,8 @@ | |||
43 | #include "util/probe-finder.h" | 44 | #include "util/probe-finder.h" |
44 | #include "util/probe-event.h" | 45 | #include "util/probe-event.h" |
45 | 46 | ||
47 | #define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*" | ||
48 | #define DEFAULT_FUNC_FILTER "!_*" | ||
46 | #define MAX_PATH_LEN 256 | 49 | #define MAX_PATH_LEN 256 |
47 | 50 | ||
48 | /* Session management structure */ | 51 | /* Session management structure */ |
@@ -52,6 +55,7 @@ static struct { | |||
52 | bool show_lines; | 55 | bool show_lines; |
53 | bool show_vars; | 56 | bool show_vars; |
54 | bool show_ext_vars; | 57 | bool show_ext_vars; |
58 | bool show_funcs; | ||
55 | bool mod_events; | 59 | bool mod_events; |
56 | int nevents; | 60 | int nevents; |
57 | struct perf_probe_event events[MAX_PROBES]; | 61 | struct perf_probe_event events[MAX_PROBES]; |
@@ -59,6 +63,7 @@ static struct { | |||
59 | struct line_range line_range; | 63 | struct line_range line_range; |
60 | const char *target_module; | 64 | const char *target_module; |
61 | int max_probe_points; | 65 | int max_probe_points; |
66 | struct strfilter *filter; | ||
62 | } params; | 67 | } params; |
63 | 68 | ||
64 | /* Parse an event definition. Note that any error must die. */ | 69 | /* Parse an event definition. Note that any error must die. */ |
@@ -157,6 +162,27 @@ static int opt_show_vars(const struct option *opt __used, | |||
157 | } | 162 | } |
158 | #endif | 163 | #endif |
159 | 164 | ||
165 | static int opt_set_filter(const struct option *opt __used, | ||
166 | const char *str, int unset __used) | ||
167 | { | ||
168 | const char *err; | ||
169 | |||
170 | if (str) { | ||
171 | pr_debug2("Set filter: %s\n", str); | ||
172 | if (params.filter) | ||
173 | strfilter__delete(params.filter); | ||
174 | params.filter = strfilter__new(str, &err); | ||
175 | if (!params.filter) { | ||
176 | pr_err("Filter parse error at %td.\n", err - str + 1); | ||
177 | pr_err("Source: \"%s\"\n", str); | ||
178 | pr_err(" %*c\n", (int)(err - str + 1), '^'); | ||
179 | return -EINVAL; | ||
180 | } | ||
181 | } | ||
182 | |||
183 | return 0; | ||
184 | } | ||
185 | |||
160 | static const char * const probe_usage[] = { | 186 | static const char * const probe_usage[] = { |
161 | "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]", | 187 | "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]", |
162 | "perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]", | 188 | "perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]", |
@@ -221,6 +247,13 @@ static const struct option options[] = { | |||
221 | OPT__DRY_RUN(&probe_event_dry_run), | 247 | OPT__DRY_RUN(&probe_event_dry_run), |
222 | OPT_INTEGER('\0', "max-probes", ¶ms.max_probe_points, | 248 | OPT_INTEGER('\0', "max-probes", ¶ms.max_probe_points, |
223 | "Set how many probe points can be found for a probe."), | 249 | "Set how many probe points can be found for a probe."), |
250 | OPT_BOOLEAN('F', "funcs", ¶ms.show_funcs, | ||
251 | "Show potential probe-able functions."), | ||
252 | OPT_CALLBACK('\0', "filter", NULL, | ||
253 | "[!]FILTER", "Set a filter (with --vars/funcs only)\n" | ||
254 | "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\" for --vars,\n" | ||
255 | "\t\t\t \"" DEFAULT_FUNC_FILTER "\" for --funcs)", | ||
256 | opt_set_filter), | ||
224 | OPT_END() | 257 | OPT_END() |
225 | }; | 258 | }; |
226 | 259 | ||
@@ -246,7 +279,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
246 | params.max_probe_points = MAX_PROBES; | 279 | params.max_probe_points = MAX_PROBES; |
247 | 280 | ||
248 | if ((!params.nevents && !params.dellist && !params.list_events && | 281 | if ((!params.nevents && !params.dellist && !params.list_events && |
249 | !params.show_lines)) | 282 | !params.show_lines && !params.show_funcs)) |
250 | usage_with_options(probe_usage, options); | 283 | usage_with_options(probe_usage, options); |
251 | 284 | ||
252 | /* | 285 | /* |
@@ -267,12 +300,41 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
267 | pr_err(" Error: Don't use --list with --vars.\n"); | 300 | pr_err(" Error: Don't use --list with --vars.\n"); |
268 | usage_with_options(probe_usage, options); | 301 | usage_with_options(probe_usage, options); |
269 | } | 302 | } |
303 | if (params.show_funcs) { | ||
304 | pr_err(" Error: Don't use --list with --funcs.\n"); | ||
305 | usage_with_options(probe_usage, options); | ||
306 | } | ||
270 | ret = show_perf_probe_events(); | 307 | ret = show_perf_probe_events(); |
271 | if (ret < 0) | 308 | if (ret < 0) |
272 | pr_err(" Error: Failed to show event list. (%d)\n", | 309 | pr_err(" Error: Failed to show event list. (%d)\n", |
273 | ret); | 310 | ret); |
274 | return ret; | 311 | return ret; |
275 | } | 312 | } |
313 | if (params.show_funcs) { | ||
314 | if (params.nevents != 0 || params.dellist) { | ||
315 | pr_err(" Error: Don't use --funcs with" | ||
316 | " --add/--del.\n"); | ||
317 | usage_with_options(probe_usage, options); | ||
318 | } | ||
319 | if (params.show_lines) { | ||
320 | pr_err(" Error: Don't use --funcs with --line.\n"); | ||
321 | usage_with_options(probe_usage, options); | ||
322 | } | ||
323 | if (params.show_vars) { | ||
324 | pr_err(" Error: Don't use --funcs with --vars.\n"); | ||
325 | usage_with_options(probe_usage, options); | ||
326 | } | ||
327 | if (!params.filter) | ||
328 | params.filter = strfilter__new(DEFAULT_FUNC_FILTER, | ||
329 | NULL); | ||
330 | ret = show_available_funcs(params.target_module, | ||
331 | params.filter); | ||
332 | strfilter__delete(params.filter); | ||
333 | if (ret < 0) | ||
334 | pr_err(" Error: Failed to show functions." | ||
335 | " (%d)\n", ret); | ||
336 | return ret; | ||
337 | } | ||
276 | 338 | ||
277 | #ifdef DWARF_SUPPORT | 339 | #ifdef DWARF_SUPPORT |
278 | if (params.show_lines) { | 340 | if (params.show_lines) { |
@@ -297,10 +359,16 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
297 | " --add/--del.\n"); | 359 | " --add/--del.\n"); |
298 | usage_with_options(probe_usage, options); | 360 | usage_with_options(probe_usage, options); |
299 | } | 361 | } |
362 | if (!params.filter) | ||
363 | params.filter = strfilter__new(DEFAULT_VAR_FILTER, | ||
364 | NULL); | ||
365 | |||
300 | ret = show_available_vars(params.events, params.nevents, | 366 | ret = show_available_vars(params.events, params.nevents, |
301 | params.max_probe_points, | 367 | params.max_probe_points, |
302 | params.target_module, | 368 | params.target_module, |
369 | params.filter, | ||
303 | params.show_ext_vars); | 370 | params.show_ext_vars); |
371 | strfilter__delete(params.filter); | ||
304 | if (ret < 0) | 372 | if (ret < 0) |
305 | pr_err(" Error: Failed to show vars. (%d)\n", ret); | 373 | pr_err(" Error: Failed to show vars. (%d)\n", ret); |
306 | return ret; | 374 | return ret; |