aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2017-06-18 10:23:02 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-06-19 21:05:54 -0400
commit1096c35aa821cc4789a64232a0e210bb87a0e5e8 (patch)
treee8c980a69b3b768e029da7850b077efc1110175b /tools/perf
parent78b83e8b12b4467540ca501c7c019e9d46051957 (diff)
perf ftrace: Add -D option for depth filter
The -D/--graph-depth option is to set max graph depth. The following example traces max 2-depth of page fault handler. $ sudo perf ftrace -G __do_page_fault -D 2 -- hello ... 0) | __do_page_fault() { 0) 0.063 us | down_read_trylock(); 0) 0.251 us | find_vma(); 0) 5.374 us | handle_mm_fault(); 0) 0.054 us | up_read(); 0) 7.463 us | } ... Signed-off-by: Namhyung Kim <namhyung@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: kernel-team@lge.com Link: http://lkml.kernel.org/r/20170618142302.25390-4-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/Documentation/perf-ftrace.txt3
-rw-r--r--tools/perf/builtin-ftrace.c31
2 files changed, 34 insertions, 0 deletions
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index 78d6126ca485..721a447f046e 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -78,6 +78,9 @@ OPTIONS
78 This can be used more than once to specify multiple functions. 78 This can be used more than once to specify multiple functions.
79 It will be passed to 'set_graph_notrace' in tracefs. 79 It will be passed to 'set_graph_notrace' in tracefs.
80 80
81-D::
82--graph-depth=::
83 Set max depth for function graph tracer to follow
81 84
82SEE ALSO 85SEE ALSO
83-------- 86--------
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 3285375ce3c2..dd26c62c9893 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -35,6 +35,7 @@ struct perf_ftrace {
35 struct list_head notrace; 35 struct list_head notrace;
36 struct list_head graph_funcs; 36 struct list_head graph_funcs;
37 struct list_head nograph_funcs; 37 struct list_head nograph_funcs;
38 int graph_depth;
38}; 39};
39 40
40struct filter_entry { 41struct filter_entry {
@@ -129,6 +130,9 @@ static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
129 if (reset_tracing_cpu() < 0) 130 if (reset_tracing_cpu() < 0)
130 return -1; 131 return -1;
131 132
133 if (write_tracing_file("max_graph_depth", "0") < 0)
134 return -1;
135
132 reset_tracing_filters(); 136 reset_tracing_filters();
133 return 0; 137 return 0;
134} 138}
@@ -237,6 +241,26 @@ static void reset_tracing_filters(void)
237 write_tracing_file("set_graph_notrace", " "); 241 write_tracing_file("set_graph_notrace", " ");
238} 242}
239 243
244static int set_tracing_depth(struct perf_ftrace *ftrace)
245{
246 char buf[16];
247
248 if (ftrace->graph_depth == 0)
249 return 0;
250
251 if (ftrace->graph_depth < 0) {
252 pr_err("invalid graph depth: %d\n", ftrace->graph_depth);
253 return -1;
254 }
255
256 snprintf(buf, sizeof(buf), "%d", ftrace->graph_depth);
257
258 if (write_tracing_file("max_graph_depth", buf) < 0)
259 return -1;
260
261 return 0;
262}
263
240static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv) 264static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
241{ 265{
242 char *trace_file; 266 char *trace_file;
@@ -284,6 +308,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
284 goto out_reset; 308 goto out_reset;
285 } 309 }
286 310
311 if (set_tracing_depth(ftrace) < 0) {
312 pr_err("failed to set graph depth\n");
313 goto out_reset;
314 }
315
287 if (write_tracing_file("current_tracer", ftrace->tracer) < 0) { 316 if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
288 pr_err("failed to set current_tracer to %s\n", ftrace->tracer); 317 pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
289 goto out_reset; 318 goto out_reset;
@@ -425,6 +454,8 @@ int cmd_ftrace(int argc, const char **argv)
425 "Set graph filter on given functions", parse_filter_func), 454 "Set graph filter on given functions", parse_filter_func),
426 OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func", 455 OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func",
427 "Set nograph filter on given functions", parse_filter_func), 456 "Set nograph filter on given functions", parse_filter_func),
457 OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
458 "Max depth for function graph tracer"),
428 OPT_END() 459 OPT_END()
429 }; 460 };
430 461