From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Steven Rostedt <rostedt@kernel.org>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
bpf@vger.kernel.org, x86@kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andrii Nakryiko <andrii@kernel.org>,
Indu Bhagat <indu.bhagat@oracle.com>,
"Jose E. Marchesi" <jemarch@gnu.org>,
Beau Belgrave <beaub@linux.microsoft.com>,
Jens Remus <jremus@linux.ibm.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Jens Axboe <axboe@kernel.dk>, Florian Weimer <fweimer@redhat.com>,
Sam James <sam@gentoo.org>
Subject: Re: [PATCH v8 06/12] unwind_user/sframe: Wire up unwind_user to sframe
Date: Tue, 8 Jul 2025 15:58:56 -0400 [thread overview]
Message-ID: <d7d840f6-dc79-471e-9390-a58da20b6721@efficios.com> (raw)
In-Reply-To: <20250708021159.386608979@kernel.org>
On 2025-07-07 22:11, Steven Rostedt wrote:
> From: Josh Poimboeuf <jpoimboe@kernel.org>
>
> Now that the sframe infrastructure is fully in place, make it work by
> hooking it up to the unwind_user interface.
>
> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
> ---
> arch/Kconfig | 1 +
> include/linux/unwind_user_types.h | 1 +
> kernel/unwind/user.c | 25 ++++++++++++++++++++++---
> 3 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/arch/Kconfig b/arch/Kconfig
> index c54d35e2f860..0c6056ef13de 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -448,6 +448,7 @@ config HAVE_UNWIND_USER_COMPAT_FP
>
> config HAVE_UNWIND_USER_SFRAME
> bool
> + select UNWIND_USER
>
> config HAVE_PERF_REGS
> bool
> diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_types.h
> index 0b6563951ca4..4d50476e950e 100644
> --- a/include/linux/unwind_user_types.h
> +++ b/include/linux/unwind_user_types.h
> @@ -13,6 +13,7 @@ enum unwind_user_type {
> UNWIND_USER_TYPE_NONE,
> UNWIND_USER_TYPE_FP,
> UNWIND_USER_TYPE_COMPAT_FP,
> + UNWIND_USER_TYPE_SFRAME,
> };
>
> struct unwind_stacktrace {
> diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c
> index 249d9e32fad7..6e7ca9f1293a 100644
> --- a/kernel/unwind/user.c
> +++ b/kernel/unwind/user.c
> @@ -7,6 +7,7 @@
> #include <linux/sched/task_stack.h>
> #include <linux/unwind_user.h>
> #include <linux/uaccess.h>
> +#include <linux/sframe.h>
>
> static struct unwind_user_frame fp_frame = {
> ARCH_INIT_USER_FP_FRAME
> @@ -31,6 +32,12 @@ static inline bool compat_fp_state(struct unwind_user_state *state)
> state->type == UNWIND_USER_TYPE_COMPAT_FP;
> }
>
> +static inline bool sframe_state(struct unwind_user_state *state)
> +{
> + return IS_ENABLED(CONFIG_HAVE_UNWIND_USER_SFRAME) &&
> + state->type == UNWIND_USER_TYPE_SFRAME;
> +}
> +
> #define unwind_get_user_long(to, from, state) \
> ({ \
> int __ret; \
> @@ -44,18 +51,28 @@ static inline bool compat_fp_state(struct unwind_user_state *state)
> static int unwind_user_next(struct unwind_user_state *state)
> {
> struct unwind_user_frame *frame;
> + struct unwind_user_frame _frame;
> unsigned long cfa = 0, fp, ra = 0;
> unsigned int shift;
>
> if (state->done)
> return -EINVAL;
>
> - if (compat_fp_state(state))
> + if (compat_fp_state(state)) {
> frame = &compat_fp_frame;
> - else if (fp_state(state))
> + } else if (sframe_state(state)) {
> + /* sframe expects the frame to be local storage */
> + frame = &_frame;
> + if (sframe_find(state->ip, frame)) {
> + if (!IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP))
> + goto done;
> + frame = &fp_frame;
> + }
> + } else if (fp_state(state)) {
> frame = &fp_frame;
> - else
> + } else {
> goto done;
> + }
>
> if (frame->use_fp) {
> if (state->fp < state->sp)
> @@ -111,6 +128,8 @@ static int unwind_user_start(struct unwind_user_state *state)
>
> if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_COMPAT_FP) && in_compat_mode(regs))
> state->type = UNWIND_USER_TYPE_COMPAT_FP;
> + else if (current_has_sframe())
> + state->type = UNWIND_USER_TYPE_SFRAME;
I think you'll want to update the state->type during the
traversal (in next()), because depending on whether
sframe is available for a given memory area of code
or not, the next() function can use either frame pointers
or sframe during the same traversal. It would be good
to know which is used after each specific call to next().
Thanks,
Mathieu
> else if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP))
> state->type = UNWIND_USER_TYPE_FP;
> else
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
next prev parent reply other threads:[~2025-07-08 19:59 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-08 2:11 [PATCH v8 00/12] unwind_deferred: Implement sframe handling Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 01/12] unwind_user/sframe: Add support for reading .sframe headers Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 02/12] unwind_user/sframe: Store sframe section data in per-mm maple tree Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 03/12] x86/uaccess: Add unsafe_copy_from_user() implementation Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 04/12] unwind_user/sframe: Add support for reading .sframe contents Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 05/12] unwind_user/sframe: Detect .sframe sections in executables Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 06/12] unwind_user/sframe: Wire up unwind_user to sframe Steven Rostedt
2025-07-08 19:58 ` Mathieu Desnoyers [this message]
2025-07-08 20:11 ` Steven Rostedt
2025-07-09 7:58 ` Jens Remus
2025-07-09 13:46 ` Mathieu Desnoyers
2025-07-09 13:51 ` Mathieu Desnoyers
2025-07-09 14:06 ` Steven Rostedt
2025-07-09 14:10 ` Mathieu Desnoyers
2025-07-09 14:29 ` Steven Rostedt
2025-07-09 15:14 ` Mathieu Desnoyers
2025-07-10 8:03 ` Jens Remus
2025-07-10 9:26 ` Jens Remus
2025-07-10 15:30 ` Steven Rostedt
2025-07-10 20:51 ` Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 07/12] unwind_user/sframe/x86: Enable sframe unwinding on x86 Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 08/12] unwind_user/sframe: Remove .sframe section on detected corruption Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 09/12] unwind_user/sframe: Show file name in debug output Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 10/12] unwind_user/sframe: Enable debugging in uaccess regions Steven Rostedt
2025-07-08 3:38 ` Linus Torvalds
2025-07-08 13:23 ` Steven Rostedt
2025-07-08 14:34 ` Josh Poimboeuf
2025-07-08 14:41 ` Steven Rostedt
2025-07-08 15:53 ` Linus Torvalds
2025-07-08 16:31 ` Steven Rostedt
2025-07-08 18:57 ` Josh Poimboeuf
2025-07-08 15:52 ` Linus Torvalds
2025-07-08 2:11 ` [PATCH v8 11/12] unwind_user/sframe: Add .sframe validation option Steven Rostedt
2025-07-08 2:11 ` [PATCH v8 12/12] unwind_user/sframe: Add prctl() interface for registering .sframe sections 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=d7d840f6-dc79-471e-9390-a58da20b6721@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=axboe@kernel.dk \
--cc=beaub@linux.microsoft.com \
--cc=bpf@vger.kernel.org \
--cc=fweimer@redhat.com \
--cc=indu.bhagat@oracle.com \
--cc=jemarch@gnu.org \
--cc=jolsa@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=jremus@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@kernel.org \
--cc=sam@gentoo.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).