From: Namhyung Kim <namhyung@kernel.org>
To: duchangbin <changbin.du@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Liang, Kan" <kan.liang@linux.intel.com>,
"linux-perf-users@vger.kernel.org"
<linux-perf-users@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] perf: ftrace: add graph tracer options args/retval/retval-hex/retaddr
Date: Tue, 22 Jul 2025 17:53:18 -0700 [thread overview]
Message-ID: <aIAyfpLifAM-BoFb@google.com> (raw)
In-Reply-To: <cee4d3e644ab4bea8959eff1c16d2a20@huawei.com>
Hello,
On Tue, Jul 22, 2025 at 10:03:58AM +0000, duchangbin wrote:
> Kindly ping.
Sorry for the delay, processing now...
Thanks,
Namhyung
>
> On Fri, Jun 13, 2025 at 07:40:47PM +0800, Changbin Du wrote:
> > This change adds support for new funcgraph tracer options funcgraph-args,
> > funcgraph-retval, funcgraph-retval-hex and funcgraph-retaddr.
> >
> > The new added options are:
> > - args : Show function arguments.
> > - retval : Show function return value.
> > - retval-hex : Show function return value in hexadecimal format.
> > - retaddr : Show function return address.
> >
> > # ./perf ftrace -G vfs_write --graph-opts retval,retaddr
> > # tracer: function_graph
> > #
> > # CPU DURATION FUNCTION CALLS
> > # | | | | | | |
> > 5) | mutex_unlock() { /* <-rb_simple_write+0xda/0x150 */
> > 5) 0.188 us | local_clock(); /* <-lock_release+0x2ad/0x440 ret=0x3bf2a3cf90e */
> > 5) | rt_mutex_slowunlock() { /* <-rb_simple_write+0xda/0x150 */
> > 5) | _raw_spin_lock_irqsave() { /* <-rt_mutex_slowunlock+0x4f/0x200 */
> > 5) 0.123 us | preempt_count_add(); /* <-_raw_spin_lock_irqsave+0x23/0x90 ret=0x0 */
> > 5) 0.128 us | local_clock(); /* <-__lock_acquire.isra.0+0x17a/0x740 ret=0x3bf2a3cfc8b */
> > 5) 0.086 us | do_raw_spin_trylock(); /* <-_raw_spin_lock_irqsave+0x4a/0x90 ret=0x1 */
> > 5) 0.845 us | } /* _raw_spin_lock_irqsave ret=0x292 */
> > 5) | _raw_spin_unlock_irqrestore() { /* <-rt_mutex_slowunlock+0x191/0x200 */
> > 5) 0.097 us | local_clock(); /* <-lock_release+0x2ad/0x440 ret=0x3bf2a3cff1f */
> > 5) 0.086 us | do_raw_spin_unlock(); /* <-_raw_spin_unlock_irqrestore+0x23/0x60 ret=0x1 */
> > 5) 0.104 us | preempt_count_sub(); /* <-_raw_spin_unlock_irqrestore+0x35/0x60 ret=0x0 */
> > 5) 0.726 us | } /* _raw_spin_unlock_irqrestore ret=0x80000000 */
> > 5) 1.881 us | } /* rt_mutex_slowunlock ret=0x0 */
> > 5) 2.931 us | } /* mutex_unlock ret=0x0 */
> >
> > Signed-off-by: Changbin Du <changbin.du@huawei.com>
> > ---
> > tools/perf/Documentation/perf-ftrace.txt | 4 ++
> > tools/perf/builtin-ftrace.c | 60 +++++++++++++++++++++++-
> > tools/perf/util/ftrace.h | 4 ++
> > 3 files changed, 67 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
> > index b77f58c4d2fd..4b21a755132f 100644
> > --- a/tools/perf/Documentation/perf-ftrace.txt
> > +++ b/tools/perf/Documentation/perf-ftrace.txt
> > @@ -123,6 +123,10 @@ OPTIONS for 'perf ftrace trace'
> > --graph-opts::
> > List of options allowed to set:
> >
> > + - args - Show function arguments.
> > + - retval - Show function return value.
> > + - retval-hex - Show function return value in hexadecimal format.
> > + - retaddr - Show function return address.
> > - 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.
> > diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
> > index bba36ebc2aa7..f7cf1dd7b64b 100644
> > --- a/tools/perf/builtin-ftrace.c
> > +++ b/tools/perf/builtin-ftrace.c
> > @@ -301,6 +301,10 @@ static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
> > write_tracing_option_file("funcgraph-proc", "0");
> > write_tracing_option_file("funcgraph-abstime", "0");
> > write_tracing_option_file("funcgraph-tail", "0");
> > + write_tracing_option_file("funcgraph-args", "0");
> > + write_tracing_option_file("funcgraph-retval", "0");
> > + write_tracing_option_file("funcgraph-retval-hex", "0");
> > + write_tracing_option_file("funcgraph-retaddr", "0");
> > write_tracing_option_file("latency-format", "0");
> > write_tracing_option_file("irq-info", "0");
> > }
> > @@ -542,6 +546,41 @@ static int set_tracing_sleep_time(struct perf_ftrace *ftrace)
> > return 0;
> > }
> >
> > +static int set_tracing_funcgraph_args(struct perf_ftrace *ftrace)
> > +{
> > + if (ftrace->graph_args) {
> > + if (write_tracing_option_file("funcgraph-args", "1") < 0)
> > + return -1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static int set_tracing_funcgraph_retval(struct perf_ftrace *ftrace)
> > +{
> > + if (ftrace->graph_retval || ftrace->graph_retval_hex) {
> > + if (write_tracing_option_file("funcgraph-retval", "1") < 0)
> > + return -1;
> > + }
> > +
> > + if (ftrace->graph_retval_hex) {
> > + if (write_tracing_option_file("funcgraph-retval-hex", "1") < 0)
> > + return -1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static int set_tracing_funcgraph_retaddr(struct perf_ftrace *ftrace)
> > +{
> > + if (ftrace->graph_retaddr) {
> > + if (write_tracing_option_file("funcgraph-retaddr", "1") < 0)
> > + return -1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > static int set_tracing_funcgraph_irqs(struct perf_ftrace *ftrace)
> > {
> > if (!ftrace->graph_noirqs)
> > @@ -642,6 +681,21 @@ static int set_tracing_options(struct perf_ftrace *ftrace)
> > return -1;
> > }
> >
> > + if (set_tracing_funcgraph_args(ftrace) < 0) {
> > + pr_err("failed to set tracing option funcgraph-args\n");
> > + return -1;
> > + }
> > +
> > + if (set_tracing_funcgraph_retval(ftrace) < 0) {
> > + pr_err("failed to set tracing option funcgraph-retval\n");
> > + return -1;
> > + }
> > +
> > + if (set_tracing_funcgraph_retaddr(ftrace) < 0) {
> > + pr_err("failed to set tracing option funcgraph-retaddr\n");
> > + return -1;
> > + }
> > +
> > if (set_tracing_funcgraph_irqs(ftrace) < 0) {
> > pr_err("failed to set tracing option funcgraph-irqs\n");
> > return -1;
> > @@ -1607,6 +1661,10 @@ static int parse_graph_tracer_opts(const struct option *opt,
> > int ret;
> > struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value;
> > struct sublevel_option graph_tracer_opts[] = {
> > + { .name = "args", .value_ptr = &ftrace->graph_args },
> > + { .name = "retval", .value_ptr = &ftrace->graph_retval },
> > + { .name = "retval-hex", .value_ptr = &ftrace->graph_retval_hex },
> > + { .name = "retaddr", .value_ptr = &ftrace->graph_retaddr },
> > { .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time },
> > { .name = "noirqs", .value_ptr = &ftrace->graph_noirqs },
> > { .name = "verbose", .value_ptr = &ftrace->graph_verbose },
> > @@ -1699,7 +1757,7 @@ int cmd_ftrace(int argc, const char **argv)
> > OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func",
> > "Set nograph filter on given functions", parse_filter_func),
> > OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
> > - "Graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>",
> > + "Graph tracer options, available options: args,retval,retval-hex,retaddr,nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>",
> > parse_graph_tracer_opts),
> > OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
> > "Size of per cpu buffer, needs to use a B, K, M or G suffix.", parse_buffer_size),
> > diff --git a/tools/perf/util/ftrace.h b/tools/perf/util/ftrace.h
> > index a9bc47da83a5..782c33227e92 100644
> > --- a/tools/perf/util/ftrace.h
> > +++ b/tools/perf/util/ftrace.h
> > @@ -29,6 +29,10 @@ struct perf_ftrace {
> > int graph_depth;
> > int func_stack_trace;
> > int func_irq_info;
> > + int graph_args;
> > + int graph_retval;
> > + int graph_retval_hex;
> > + int graph_retaddr;
> > int graph_nosleep_time;
> > int graph_noirqs;
> > int graph_verbose;
> > --
> > 2.43.0
> >
>
> --
> Cheers,
> Changbin Du
next prev parent reply other threads:[~2025-07-23 0:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-13 11:40 [PATCH] perf: ftrace: add graph tracer options args/retval/retval-hex/retaddr Changbin Du
2025-07-22 10:03 ` duchangbin
2025-07-23 0:53 ` Namhyung Kim [this message]
2025-07-22 15:10 ` Ian Rogers
2025-07-23 17:30 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aIAyfpLifAM-BoFb@google.com \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=changbin.du@huawei.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.