From: Sasha Levin <sashal@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
bpf@vger.kernel.org, Masami Hiramatsu <mhiramat@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Andrew Morton <akpm@linux-foundation.org>,
Sven Schnelle <svens@linux.ibm.com>,
Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>, Guo Ren <guoren@kernel.org>,
Donglin Peng <dolinux.peng@gmail.com>,
Zheng Yejian <zhengyejian@huaweicloud.com>
Subject: Re: [PATCH v4 2/4] ftrace: Add support for function argument to graph tracer
Date: Thu, 14 Aug 2025 13:05:35 -0400 [thread overview]
Message-ID: <aJ4XX4qvHUZRAFxF@lappy> (raw)
In-Reply-To: <20250813195317.508a29aa@batman.local.home>
On Wed, Aug 13, 2025 at 07:53:17PM -0400, Steven Rostedt wrote:
>On Fri, 8 Aug 2025 22:24:05 -0400
>Sasha Levin <sashal@kernel.org> wrote:
>
>> So we've added a dynamically sized array to the end of
>> ftrace_graph_ent_entry, but in struct fgraph_data, the saved entry is
>> defined as:
>>
>> struct fgraph_data {
>> ...
>> union {
>> struct ftrace_graph_ent_entry ent;
>> struct fgraph_retaddr_ent_entry rent;
>> } ent;
>> ...
>> }
>>
>> Which doesn't seem to have room for args?
>
>No it doesn't :-p
>
>>
>> The code in get_return_for_leaf() does:
>>
>> data->ent.ent = *curr;
>>
>> This copies the struct, but curr points to a larger entry with args
>> data. The copy operation only copies sizeof(struct
>> ftrace_graph_ent_entry) bytes, which doesn't include the dynamic args
>> array.
>>
>> And then later functions (like print_graph_entry()) would go ahead and
>> assume that iter->ent_size is sane and make a mess out of everything.
>>
>> I can't test right now whether this actually fixes the issues or not,
>> but I wanted to bring this up as this looks somewhat odd and I'm not too
>> familiar with this code.
>
>Thanks for the detail analysis, can you test this patch?
>
>-- Steve
>
>diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
>index 66e1a527cf1a..25ea71edb8da 100644
>--- a/kernel/trace/trace_functions_graph.c
>+++ b/kernel/trace/trace_functions_graph.c
>@@ -35,6 +35,11 @@ struct fgraph_data {
> struct ftrace_graph_ent_entry ent;
> struct fgraph_retaddr_ent_entry rent;
> } ent;
>+ /*
>+ * The @args must be right after @ent, as it is where they
>+ * are stored in case the function graph tracer has arguments.
>+ */
>+ unsigned long args[FTRACE_REGS_MAX_ARGS];
> struct ftrace_graph_ret_entry ret;
> int failed;
> int cpu;
>@@ -623,14 +628,29 @@ get_return_for_leaf(struct trace_iterator *iter,
> next = ring_buffer_event_data(event);
>
> if (data) {
>+ int args_size;
>+ int size;
>+
> /*
> * Save current and next entries for later reference
> * if the output fails.
> */
>- if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT))
>+ if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) {
> data->ent.rent = *(struct fgraph_retaddr_ent_entry *)curr;
>- else
>+ size = offsetof(struct fgraph_retaddr_ent_entry, args);
>+ } else {
> data->ent.ent = *curr;
>+ size = offsetof(struct ftrace_graph_ent_entry, args);
>+ }
>+
>+ /* If this has args, then append them to after the ent. */
>+ args_size = iter->ent_size - size;
>+ if (args_size > sizeof(long) * FTRACE_REGS_MAX_ARGS)
>+ args_size = sizeof(long) * FTRACE_REGS_MAX_ARGS;
>+
>+ if (args_size >= sizeof(long))
>+ memcpy((void *)&data->ent.ent + size,
>+ (void*)curr + size, args_size);
> /*
> * If the next event is not a return type, then
> * we only care about what type it is. Otherwise we can
Got a small build error:
kernel/trace/trace_functions_graph.c: In function ‘get_return_for_leaf’:
./include/linux/stddef.h:16:33: error: ‘struct fgraph_retaddr_ent_entry’ has no member named ‘args’
16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER)
| ^~~~~~~~~~~~~~~~~~
kernel/trace/trace_functions_graph.c:640:40: note: in expansion of macro ‘offsetof’
640 | size = offsetof(struct fgraph_retaddr_ent_entry, args);
| ^~~~~~~~
Does this look right on top of your patch:
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 25ea71edb8da..f0f37356ef29 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -637,20 +637,21 @@ get_return_for_leaf(struct trace_iterator *iter,
*/
if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) {
data->ent.rent = *(struct fgraph_retaddr_ent_entry *)curr;
- size = offsetof(struct fgraph_retaddr_ent_entry, args);
+ /* fgraph_retaddr_ent_entry doesn't have args field */
+ size = sizeof(struct fgraph_retaddr_ent_entry);
+ args_size = 0;
} else {
data->ent.ent = *curr;
size = offsetof(struct ftrace_graph_ent_entry, args);
+ /* If this has args, then append them to after the ent. */
+ args_size = iter->ent_size - size;
+ if (args_size > sizeof(long) * FTRACE_REGS_MAX_ARGS)
+ args_size = sizeof(long) * FTRACE_REGS_MAX_ARGS;
+
+ if (args_size >= sizeof(long))
+ memcpy((void *)&data->ent.ent + size,
+ (void*)curr + size, args_size);
}
-
- /* If this has args, then append them to after the ent. */
- args_size = iter->ent_size - size;
- if (args_size > sizeof(long) * FTRACE_REGS_MAX_ARGS)
- args_size = sizeof(long) * FTRACE_REGS_MAX_ARGS;
-
- if (args_size >= sizeof(long))
- memcpy((void *)&data->ent.ent + size,
- (void*)curr + size, args_size);
/*
* If the next event is not a return type, then
* we only care about what type it is. Otherwise we can
--
Thanks,
Sasha
next prev parent reply other threads:[~2025-08-14 17:05 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-27 18:58 [PATCH v4 0/4] ftrace: Add function arguments to function tracers Steven Rostedt
2025-02-27 18:58 ` [PATCH v4 1/4] ftrace: Add print_function_args() Steven Rostedt
2025-02-27 18:58 ` [PATCH v4 2/4] ftrace: Add support for function argument to graph tracer Steven Rostedt
2025-04-09 22:34 ` Mark Brown
2025-04-10 17:17 ` Steven Rostedt
2025-04-11 13:00 ` Mark Brown
2025-04-11 16:45 ` Steven Rostedt
2025-04-11 16:48 ` Steven Rostedt
2025-04-11 17:02 ` Steven Rostedt
2025-04-11 17:33 ` Steven Rostedt
2025-04-11 16:58 ` Mark Brown
2025-04-11 17:12 ` Steven Rostedt
2025-04-11 17:39 ` Mark Brown
2025-04-11 18:16 ` Mark Brown
2025-04-11 18:24 ` Steven Rostedt
2025-04-11 18:29 ` Mark Brown
2025-04-11 18:31 ` Steven Rostedt
2025-04-11 19:13 ` Steven Rostedt
2025-04-11 19:26 ` Steven Rostedt
2025-04-11 19:27 ` Steven Rostedt
2025-04-14 3:00 ` Masami Hiramatsu
2025-04-14 3:08 ` Masami Hiramatsu
2025-04-14 13:31 ` Steven Rostedt
2025-04-15 17:40 ` Steven Rostedt
2025-08-09 2:24 ` Sasha Levin
2025-08-13 23:53 ` Steven Rostedt
2025-08-14 17:05 ` Sasha Levin [this message]
2025-08-19 22:21 ` Steven Rostedt
2025-02-27 18:58 ` [PATCH v4 3/4] ftrace: Have funcgraph-args take affect during tracing Steven Rostedt
2025-02-27 18:58 ` [PATCH v4 4/4] ftrace: Add arguments to function tracer Steven Rostedt
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=aJ4XX4qvHUZRAFxF@lappy \
--to=sashal@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=aou@eecs.berkeley.edu \
--cc=bpf@vger.kernel.org \
--cc=dolinux.peng@gmail.com \
--cc=guoren@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=rostedt@goodmis.org \
--cc=svens@linux.ibm.com \
--cc=zhengyejian@huaweicloud.com \
/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.