This adds an option '--graph-opts thresh' to setup trace duration threshold for funcgraph tracer. $ sudo ./perf ftrace -G '*' --graph-opts thresh=100 3) ! 184.060 us | } /* schedule */ 3) ! 185.600 us | } /* exit_to_usermode_loop */ 2) ! 225.989 us | } /* schedule_idle */ 2) # 4140.051 us | } /* do_idle */
Unified · Split
| @@ -107,6 +107,7 @@ OPTIONS · 106 unmodified lines | ||
| 107 | 107 | nosleep-time - Measure on-CPU time only for function_graph tracer. |
| 108 | 108 | noirqs - Ignore functions that happen inside interrupt. |
| 109 | 109 | verbose - Show process names, PIDs, timestamps, etc. |
| 110 | + thresh=<n> - Setup trace duration threshold in microseconds. | |
| 110 | 111 | |
| 111 | 112 | SEE ALSO |
| 112 | 113 | -------- |
| @@ -48,6 +48,7 @@ struct perf_ftrace { · 47 unmodified lines | ||
| 48 | 48 | int graph_nosleep_time; |
| 49 | 49 | int graph_noirqs; |
| 50 | 50 | int graph_verbose; |
| 51 | + int graph_thresh; | |
| 51 | 52 | }; |
| 52 | 53 | |
| 53 | 54 | struct filter_entry { |
| @@ -234,6 +235,9 @@ static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused) · 180 unmodified lines | ||
| 234 | 235 | if (write_tracing_file("max_graph_depth", "0") < 0) |
| 235 | 236 | return -1; |
| 236 | 237 | |
| 238 | + if (write_tracing_file("tracing_thresh", "0") < 0) | |
| 239 | + return -1; | |
| 240 | + | |
| 237 | 241 | reset_tracing_filters(); |
| 238 | 242 | reset_tracing_options(ftrace); |
| 239 | 243 | return 0; |
| @@ -446,6 +450,20 @@ static int set_tracing_funcgraph_verbose(struct perf_ftrace *ftrace) · 206 unmodified lines | ||
| 446 | 450 | return 0; |
| 447 | 451 | } |
| 448 | 452 | |
| 453 | +static int set_tracing_thresh(struct perf_ftrace *ftrace) | |
| 454 | +{ | |
| 455 | + int ret; | |
| 456 | + | |
| 457 | + if (ftrace->graph_thresh == 0) | |
| 458 | + return 0; | |
| 459 | + | |
| 460 | + ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh); | |
| 461 | + if (ret < 0) | |
| 462 | + return ret; | |
| 463 | + | |
| 464 | + return 0; | |
| 465 | +} | |
| 466 | + | |
| 449 | 467 | static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv) |
| 450 | 468 | { |
| 451 | 469 | char *trace_file; |
| @@ -545,6 +563,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv) · 93 unmodified lines | ||
| 545 | 563 | goto out_reset; |
| 546 | 564 | } |
| 547 | 565 | |
| 566 | + if (set_tracing_thresh(ftrace) < 0) { | |
| 567 | + pr_err("failed to set tracing thresh\n"); | |
| 568 | + goto out_reset; | |
| 569 | + } | |
| 570 | + | |
| 548 | 571 | if (write_tracing_file("current_tracer", ftrace->tracer) < 0) { |
| 549 | 572 | pr_err("failed to set current_tracer to %s\n", ftrace->tracer); |
| 550 | 573 | goto out_reset; |
| @@ -727,6 +750,7 @@ static int parse_graph_tracer_opts(const struct option *opt, · 176 unmodified lines | ||
| 727 | 750 | { .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time }, |
| 728 | 751 | { .name = "noirqs", .value_ptr = &ftrace->graph_noirqs }, |
| 729 | 752 | { .name = "verbose", .value_ptr = &ftrace->graph_verbose }, |
| 753 | + { .name = "thresh", .value_ptr = &ftrace->graph_thresh }, | |
| 730 | 754 | { .name = NULL, } |
| 731 | 755 | }; |
| 732 | 756 | |
| @@ -798,7 +822,7 @@ int cmd_ftrace(int argc, const char **argv) · 65 unmodified lines | ||
| 798 | 822 | OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth, |
| 799 | 823 | "Max depth for function graph tracer"), |
| 800 | 824 | OPT_CALLBACK(0, "graph-opts", &ftrace, "options", |
| 801 | − "graph tracer options, available options: nosleep-time,noirqs,verbose", | |
| 825 | + "graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>", | |
| 802 | 826 | parse_graph_tracer_opts), |
| 803 | 827 | OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size", |
| 804 | 828 | "size of per cpu buffer", parse_buffer_size), |