Re: [PATCH v8 13/18] perf ftrace: add support for trace option tracing_thresh

2020-08-20 Thread Changbin Du
On Fri, Aug 14, 2020 at 09:33:10AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Sat, Aug 08, 2020 at 10:31:36AM +0800, Changbin Du escreveu:
> > This adds an option '--graph-opts thresh' to setup trace duration
> > threshold for funcgraph tracer.
> 
> Applied, please consider making --duration an alias for this, as this is
> also available in 'perf trace':
> 
> [root@quaco ~]# perf trace --duration 500 --max-events=5
>369.860 gnome-shell/2084 poll(ufds: 0x559577983080, nfds: 21, 
> timeout_msecs: 7194) = 1
>493.654 pool-geoclue/386046 futex(uaddr: 0x56024843b610, op: 
> WAIT|PRIVATE_FLAG, val: 1201, utime: 0x7f32bd7f9cc0) = -1 ETIMEDOUT 
> (Connection timed out)
> 71.604 WebRTC_Worker/111634 futex(uaddr: 0x7fb4c364d608, op: 
> WAIT_BITSET|PRIVATE_FLAG, val: 0, utime: 0x7fb4c364d410, val3: MATCH_ANY) = 
> -1 ETIMEDOUT (Connection timed out)
>601.645 pool-gsd-smart/2469 clock_nanosleep(which_clock: 0, flags: 0, 
> rqtp: 0x7fb82cbd1cf0, rmtp: 0x7fb82cbd1d00) = 0
>623.823 chromium-brows/92363 futex(uaddr: 0x7ffcfd064e38, op: 
> WAIT_BITSET|PRIVATE_FLAG, val: 0, utime: 0x7ffcfd064c40, val3: MATCH_ANY) = 
> -1 ETIMEDOUT (Connection timed out)
> [root@quaco ~]#
> 
>   $ perf trace -h duration
> 
> --duration 
>   show only events with duration > N.M ms
> 
>   $
> 
> This way one would be able to do:
> 
>   # perf trace --duration N.M
> 
> To see at syscall level, then add 'f':
> 
>   # perf ftrace --duration N.M
> 
> To see at kernel function level. Switching from one perf tool to another
> with such ease is the main objective here, I'd say :-)
>
Sure. Currently the unit for ftrace is 'ns'. I could change it to 'ms' at perf
level.

> - Arnaldo
>  
> > $ 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 */
> > 
> > Signed-off-by: Changbin Du 
> > ---
> >  tools/perf/Documentation/perf-ftrace.txt |  1 +
> >  tools/perf/builtin-ftrace.c  | 26 +++-
> >  2 files changed, 26 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/perf/Documentation/perf-ftrace.txt 
> > b/tools/perf/Documentation/perf-ftrace.txt
> > index a2056aaf2ece..6fa927e5971b 100644
> > --- a/tools/perf/Documentation/perf-ftrace.txt
> > +++ b/tools/perf/Documentation/perf-ftrace.txt
> > @@ -107,6 +107,7 @@ OPTIONS
> >   nosleep-time - Measure on-CPU time only for function_graph tracer.
> >   noirqs   - Ignore functions that happen inside interrupt.
> >   verbose  - Show process names, PIDs, timestamps, etc.
> > + thresh=   - Setup trace duration threshold in microseconds.
> >  
> >  SEE ALSO
> >  
> > diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
> > index 8ee5287bd84a..ca61f8b8bbf6 100644
> > --- a/tools/perf/builtin-ftrace.c
> > +++ b/tools/perf/builtin-ftrace.c
> > @@ -48,6 +48,7 @@ struct perf_ftrace {
> > int graph_nosleep_time;
> > int graph_noirqs;
> > int graph_verbose;
> > +   int graph_thresh;
> >  };
> >  
> >  struct filter_entry {
> > @@ -234,6 +235,9 @@ static int reset_tracing_files(struct perf_ftrace 
> > *ftrace __maybe_unused)
> > if (write_tracing_file("max_graph_depth", "0") < 0)
> > return -1;
> >  
> > +   if (write_tracing_file("tracing_thresh", "0") < 0)
> > +   return -1;
> > +
> > reset_tracing_filters();
> > reset_tracing_options(ftrace);
> > return 0;
> > @@ -446,6 +450,20 @@ static int set_tracing_funcgraph_verbose(struct 
> > perf_ftrace *ftrace)
> > return 0;
> >  }
> >  
> > +static int set_tracing_thresh(struct perf_ftrace *ftrace)
> > +{
> > +   int ret;
> > +
> > +   if (ftrace->graph_thresh == 0)
> > +   return 0;
> > +
> > +   ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh);
> > +   if (ret < 0)
> > +   return ret;
> > +
> > +   return 0;
> > +}
> > +
> >  static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char 
> > **argv)
> >  {
> > char *trace_file;
> > @@ -545,6 +563,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, 
> > int argc, const char **argv)
> > goto out_reset;
> > }
> >  
> > +   if (set_tracing_thresh(ftrace) < 0) {
> > +   pr_err("failed to set tracing thresh\n");
> > +   goto out_reset;
> > +   }
> > +
> > if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
> > pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
> > goto out_reset;
> > @@ -727,6 +750,7 @@ static int parse_graph_tracer_opts(const struct option 
> > *opt,
> > { .name = "nosleep-time",   .value_ptr = 
> > &ftrace->graph_nosleep_time },
> > { .name = "noirqs", .value_ptr = 
> > &ftrace->graph_noi

Re: [PATCH v8 13/18] perf ftrace: add support for trace option tracing_thresh

2020-08-14 Thread Arnaldo Carvalho de Melo
Em Sat, Aug 08, 2020 at 10:31:36AM +0800, Changbin Du escreveu:
> This adds an option '--graph-opts thresh' to setup trace duration
> threshold for funcgraph tracer.

Applied, please consider making --duration an alias for this, as this is
also available in 'perf trace':

[root@quaco ~]# perf trace --duration 500 --max-events=5
   369.860 gnome-shell/2084 poll(ufds: 0x559577983080, nfds: 21, timeout_msecs: 
7194) = 1
   493.654 pool-geoclue/386046 futex(uaddr: 0x56024843b610, op: 
WAIT|PRIVATE_FLAG, val: 1201, utime: 0x7f32bd7f9cc0) = -1 ETIMEDOUT (Connection 
timed out)
71.604 WebRTC_Worker/111634 futex(uaddr: 0x7fb4c364d608, op: 
WAIT_BITSET|PRIVATE_FLAG, val: 0, utime: 0x7fb4c364d410, val3: MATCH_ANY) = -1 
ETIMEDOUT (Connection timed out)
   601.645 pool-gsd-smart/2469 clock_nanosleep(which_clock: 0, flags: 0, rqtp: 
0x7fb82cbd1cf0, rmtp: 0x7fb82cbd1d00) = 0
   623.823 chromium-brows/92363 futex(uaddr: 0x7ffcfd064e38, op: 
WAIT_BITSET|PRIVATE_FLAG, val: 0, utime: 0x7ffcfd064c40, val3: MATCH_ANY) = -1 
ETIMEDOUT (Connection timed out)
[root@quaco ~]#

  $ perf trace -h duration

--duration 
  show only events with duration > N.M ms

  $

This way one would be able to do:

  # perf trace --duration N.M

To see at syscall level, then add 'f':

  # perf ftrace --duration N.M

To see at kernel function level. Switching from one perf tool to another
with such ease is the main objective here, I'd say :-)

- Arnaldo
 
> $ 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 */
> 
> Signed-off-by: Changbin Du 
> ---
>  tools/perf/Documentation/perf-ftrace.txt |  1 +
>  tools/perf/builtin-ftrace.c  | 26 +++-
>  2 files changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/Documentation/perf-ftrace.txt 
> b/tools/perf/Documentation/perf-ftrace.txt
> index a2056aaf2ece..6fa927e5971b 100644
> --- a/tools/perf/Documentation/perf-ftrace.txt
> +++ b/tools/perf/Documentation/perf-ftrace.txt
> @@ -107,6 +107,7 @@ OPTIONS
> nosleep-time - Measure on-CPU time only for function_graph tracer.
> noirqs   - Ignore functions that happen inside interrupt.
> verbose  - Show process names, PIDs, timestamps, etc.
> +   thresh=   - Setup trace duration threshold in microseconds.
>  
>  SEE ALSO
>  
> diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
> index 8ee5287bd84a..ca61f8b8bbf6 100644
> --- a/tools/perf/builtin-ftrace.c
> +++ b/tools/perf/builtin-ftrace.c
> @@ -48,6 +48,7 @@ struct perf_ftrace {
>   int graph_nosleep_time;
>   int graph_noirqs;
>   int graph_verbose;
> + int graph_thresh;
>  };
>  
>  struct filter_entry {
> @@ -234,6 +235,9 @@ static int reset_tracing_files(struct perf_ftrace *ftrace 
> __maybe_unused)
>   if (write_tracing_file("max_graph_depth", "0") < 0)
>   return -1;
>  
> + if (write_tracing_file("tracing_thresh", "0") < 0)
> + return -1;
> +
>   reset_tracing_filters();
>   reset_tracing_options(ftrace);
>   return 0;
> @@ -446,6 +450,20 @@ static int set_tracing_funcgraph_verbose(struct 
> perf_ftrace *ftrace)
>   return 0;
>  }
>  
> +static int set_tracing_thresh(struct perf_ftrace *ftrace)
> +{
> + int ret;
> +
> + if (ftrace->graph_thresh == 0)
> + return 0;
> +
> + ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh);
> + if (ret < 0)
> + return ret;
> +
> + return 0;
> +}
> +
>  static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char 
> **argv)
>  {
>   char *trace_file;
> @@ -545,6 +563,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int 
> argc, const char **argv)
>   goto out_reset;
>   }
>  
> + if (set_tracing_thresh(ftrace) < 0) {
> + pr_err("failed to set tracing thresh\n");
> + goto out_reset;
> + }
> +
>   if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
>   pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
>   goto out_reset;
> @@ -727,6 +750,7 @@ static int parse_graph_tracer_opts(const struct option 
> *opt,
>   { .name = "nosleep-time",   .value_ptr = 
> &ftrace->graph_nosleep_time },
>   { .name = "noirqs", .value_ptr = 
> &ftrace->graph_noirqs },
>   { .name = "verbose",.value_ptr = 
> &ftrace->graph_verbose },
> + { .name = "thresh", .value_ptr = 
> &ftrace->graph_thresh },
>   { .name = NULL, }
>   };
>  
> @@ -798,7 +822,7 @@ int cmd_ftrace(int argc, const char **argv)
>   OPT_INTEGER('D', "graph-depth", &ftrace.graph_d

[PATCH v8 13/18] perf ftrace: add support for trace option tracing_thresh

2020-08-07 Thread Changbin Du
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 */

Signed-off-by: Changbin Du 
---
 tools/perf/Documentation/perf-ftrace.txt |  1 +
 tools/perf/builtin-ftrace.c  | 26 +++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/tools/perf/Documentation/perf-ftrace.txt 
b/tools/perf/Documentation/perf-ftrace.txt
index a2056aaf2ece..6fa927e5971b 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -107,6 +107,7 @@ OPTIONS
  nosleep-time - Measure on-CPU time only for function_graph tracer.
  noirqs   - Ignore functions that happen inside interrupt.
  verbose  - Show process names, PIDs, timestamps, etc.
+ thresh=   - Setup trace duration threshold in microseconds.
 
 SEE ALSO
 
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 8ee5287bd84a..ca61f8b8bbf6 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -48,6 +48,7 @@ struct perf_ftrace {
int graph_nosleep_time;
int graph_noirqs;
int graph_verbose;
+   int graph_thresh;
 };
 
 struct filter_entry {
@@ -234,6 +235,9 @@ static int reset_tracing_files(struct perf_ftrace *ftrace 
__maybe_unused)
if (write_tracing_file("max_graph_depth", "0") < 0)
return -1;
 
+   if (write_tracing_file("tracing_thresh", "0") < 0)
+   return -1;
+
reset_tracing_filters();
reset_tracing_options(ftrace);
return 0;
@@ -446,6 +450,20 @@ static int set_tracing_funcgraph_verbose(struct 
perf_ftrace *ftrace)
return 0;
 }
 
+static int set_tracing_thresh(struct perf_ftrace *ftrace)
+{
+   int ret;
+
+   if (ftrace->graph_thresh == 0)
+   return 0;
+
+   ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh);
+   if (ret < 0)
+   return ret;
+
+   return 0;
+}
+
 static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char 
**argv)
 {
char *trace_file;
@@ -545,6 +563,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int 
argc, const char **argv)
goto out_reset;
}
 
+   if (set_tracing_thresh(ftrace) < 0) {
+   pr_err("failed to set tracing thresh\n");
+   goto out_reset;
+   }
+
if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
goto out_reset;
@@ -727,6 +750,7 @@ static int parse_graph_tracer_opts(const struct option *opt,
{ .name = "nosleep-time",   .value_ptr = 
&ftrace->graph_nosleep_time },
{ .name = "noirqs", .value_ptr = 
&ftrace->graph_noirqs },
{ .name = "verbose",.value_ptr = 
&ftrace->graph_verbose },
+   { .name = "thresh", .value_ptr = 
&ftrace->graph_thresh },
{ .name = NULL, }
};
 
@@ -798,7 +822,7 @@ int cmd_ftrace(int argc, const char **argv)
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
"Max depth for function graph tracer"),
OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
-"graph tracer options, available options: 
nosleep-time,noirqs,verbose",
+"graph tracer options, available options: 
nosleep-time,noirqs,verbose,thresh=",
 parse_graph_tracer_opts),
OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
 "size of per cpu buffer", parse_buffer_size),
-- 
2.25.1