From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>,
Florent Revest <revest@chromium.org>,
linux-trace-kernel@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
bpf <bpf@vger.kernel.org>, Sven Schnelle <svens@linux.ibm.com>,
Alexei Starovoitov <ast@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Alan Maguire <alan.maguire@oracle.com>,
Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>, Guo Ren <guoren@kernel.org>
Subject: Re: [PATCH v7 20/36] function_graph: Improve push operation for several interrupts
Date: Sun, 18 Feb 2024 00:53:59 +0900 [thread overview]
Message-ID: <20240218005359.7072c27c99bcfe426e2126b6@kernel.org> (raw)
In-Reply-To: <20240215095739.41a2fac7@gandalf.local.home>
On Thu, 15 Feb 2024 09:57:39 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:
> On Wed, 7 Feb 2024 00:11:12 +0900
> "Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote:
>
> > From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
> >
> > Improve push and data reserve operation on the shadow stack for
> > several sequencial interrupts.
> >
> > To push a ret_stack or data entry on the shadow stack, we need to
> > prepare an index (offset) entry before updating the stack pointer
> > (curr_ret_stack) so that unwinder from interrupts can find the
> > next return address from the shadow stack. Currently we do write index,
> > update the curr_ret_stack, and rewrite it again. But that is not enough
> > for the case if two interrupts happens and the first one breaks it.
> > For example,
> >
> > 1. write reserved index entry at ret_stack[new_index - 1] and ret addr.
> > 2. interrupt comes.
> > 2.1. push new index and ret addr on ret_stack.
> > 2.2. pop it. (corrupt entries on new_index - 1)
> > 3. return from interrupt.
> > 4. update curr_ret_stack = new_index
> > 5. interrupt comes again.
> > 5.1. unwind <------ may not work.
>
> I'm curious if you saw this happen?
>
> That is, did you trigger this or only noticed it by inspection?
I just noticed this scenario while explaining why we write the same value
twice to Jiri.
https://lore.kernel.org/all/20231220004540.0af568c69ecaf9170430a383@kernel.org/
>
> This code is already quite complex, I would like to simplify it more before
> we try to fix rare race conditions that only affect the unwinder.
>
> Let's hold off on this change.
OK, then drop this until someone hits the actual problem, maybe that
should be rare case.
Thank you,
>
> -- Steve
>
>
> >
> > To avoid this issue, this introduces a new rsrv_ret_stack stack
> > reservation pointer and a new push code (slow path) to commit
> > previous reserved code forcibly.
> >
> > 0. update rsrv_ret_stack = new_index.
> > 1. write reserved index entry at ret_stack[new_index - 1] and ret addr.
> > 2. interrupt comes.
> > 2.0. if rsrv_ret_stack != curr_ret_stack, add reserved index
> > entry on ret_stack[rsrv_ret_stack - 1] to point the previous
> > ret_stack pointed by ret_stack[curr_ret_stack - 1]. and
> > update curr_ret_stack = rsrv_ret_stack.
> > 2.1. push new index and ret addr on ret_stack.
> > 2.2. pop it. (corrupt entries on new_index - 1)
> > 3. return from interrupt.
> > 4. update curr_ret_stack = new_index
> > 5. interrupt comes again.
> > 5.1. unwind works, because curr_ret_stack points the previously
> > saved ret_stack.
> > 5.2. this can do push/pop operations too.
> > 6. return from interrupt.
> > 7. rewrite reserved index entry at ret_stack[new_index] again.
> >
> > This maybe a bit heavier but safer.
> >
> > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
next prev parent reply other threads:[~2024-02-17 15:54 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-06 15:07 [PATCH v7 00/36] tracing: fprobe: function_graph: Multi-function graph and fprobe on fgraph Masami Hiramatsu (Google)
2024-02-06 15:07 ` [PATCH v7 01/36] ftrace: Fix DIRECT_CALLS to use SAVE_REGS by default Masami Hiramatsu (Google)
2024-02-06 15:07 ` [PATCH v7 02/36] tracing: Add a comment about ftrace_regs definition Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 03/36] tracing: Rename ftrace_regs_return_value to ftrace_regs_get_return_value Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 04/36] x86: tracing: Add ftrace_regs definition in the header Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 05/36] function_graph: Convert ret_stack to a series of longs Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 06/36] fgraph: Use BUILD_BUG_ON() to make sure we have structures divisible by long Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 07/36] function_graph: Add an array structure that will allow multiple callbacks Masami Hiramatsu (Google)
2024-02-06 15:08 ` [PATCH v7 08/36] function_graph: Allow multiple users to attach to function graph Masami Hiramatsu (Google)
2024-02-06 15:09 ` [PATCH v7 09/36] function_graph: Remove logic around ftrace_graph_entry and return Masami Hiramatsu (Google)
2024-02-06 15:09 ` [PATCH v7 10/36] ftrace/function_graph: Pass fgraph_ops to function graph callbacks Masami Hiramatsu (Google)
2024-02-14 1:42 ` Steven Rostedt
2024-02-14 13:28 ` Masami Hiramatsu
2024-02-06 15:09 ` [PATCH v7 11/36] ftrace: Allow function_graph tracer to be enabled in instances Masami Hiramatsu (Google)
2024-02-06 15:09 ` [PATCH v7 12/36] ftrace: Allow ftrace startup flags exist without dynamic ftrace Masami Hiramatsu (Google)
2024-02-06 15:09 ` [PATCH v7 13/36] function_graph: Have the instances use their own ftrace_ops for filtering Masami Hiramatsu (Google)
2024-02-07 14:02 ` Masami Hiramatsu
2024-02-06 15:10 ` [PATCH v7 14/36] function_graph: Use a simple LRU for fgraph_array index number Masami Hiramatsu (Google)
2024-02-14 18:04 ` Steven Rostedt
2024-02-14 23:48 ` Masami Hiramatsu
2024-02-06 15:10 ` [PATCH v7 15/36] function_graph: Add "task variables" per task for fgraph_ops Masami Hiramatsu (Google)
2024-02-06 15:10 ` [PATCH v7 16/36] function_graph: Move set_graph_function tests to shadow stack global var Masami Hiramatsu (Google)
2024-02-06 15:10 ` [PATCH v7 17/36] function_graph: Move graph depth stored data " Masami Hiramatsu (Google)
2024-02-06 15:10 ` [PATCH v7 18/36] function_graph: Move graph notrace bit " Masami Hiramatsu (Google)
2024-02-06 15:11 ` [PATCH v7 19/36] function_graph: Implement fgraph_reserve_data() and fgraph_retrieve_data() Masami Hiramatsu (Google)
2024-02-14 18:59 ` Steven Rostedt
2024-02-14 23:45 ` Masami Hiramatsu
2024-02-14 23:54 ` Steven Rostedt
2024-02-16 7:40 ` Masami Hiramatsu
2024-02-06 15:11 ` [PATCH v7 20/36] function_graph: Improve push operation for several interrupts Masami Hiramatsu (Google)
2024-02-15 14:57 ` Steven Rostedt
2024-02-17 15:53 ` Masami Hiramatsu [this message]
2024-02-06 15:11 ` [PATCH v7 21/36] function_graph: Add selftest for passing local variables Masami Hiramatsu (Google)
2024-02-15 15:02 ` Steven Rostedt
2024-02-16 8:41 ` Masami Hiramatsu
2024-02-06 15:11 ` [PATCH v7 22/36] function_graph: Add a new entry handler with parent_ip and ftrace_regs Masami Hiramatsu (Google)
2024-02-15 15:38 ` Steven Rostedt
2024-02-19 16:07 ` Steven Rostedt
2024-02-06 15:11 ` [PATCH v7 23/36] function_graph: Add a new exit " Masami Hiramatsu (Google)
2024-02-15 15:39 ` Steven Rostedt
2024-02-16 8:42 ` Masami Hiramatsu
2024-02-15 15:49 ` Steven Rostedt
2024-02-16 8:43 ` Masami Hiramatsu
2024-02-15 16:04 ` Steven Rostedt
2024-02-16 8:51 ` Masami Hiramatsu
2024-02-18 2:53 ` Masami Hiramatsu
2024-02-19 14:04 ` Masami Hiramatsu
2024-02-06 15:11 ` [PATCH v7 24/36] x86/ftrace: Enable HAVE_FUNCTION_GRAPH_FREGS Masami Hiramatsu (Google)
2024-02-15 16:08 ` Steven Rostedt
2024-02-16 8:54 ` Masami Hiramatsu
2024-02-06 15:12 ` [PATCH v7 25/36] arm64: ftrace: " Masami Hiramatsu (Google)
2024-02-15 16:10 ` Steven Rostedt
2024-02-16 12:49 ` Masami Hiramatsu
2024-02-06 15:12 ` [PATCH v7 26/36] fprobe: Use ftrace_regs in fprobe entry handler Masami Hiramatsu (Google)
2024-02-06 15:12 ` [PATCH v7 27/36] fprobe: Use ftrace_regs in fprobe exit handler Masami Hiramatsu (Google)
2024-02-06 15:12 ` [PATCH v7 28/36] tracing: Add ftrace_partial_regs() for converting ftrace_regs to pt_regs Masami Hiramatsu (Google)
2024-02-15 16:11 ` Steven Rostedt
2024-02-16 13:09 ` Masami Hiramatsu
2024-02-16 14:24 ` Steven Rostedt
2024-02-06 15:12 ` [PATCH v7 29/36] tracing: Add ftrace_fill_perf_regs() for perf event Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 30/36] tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 31/36] bpf: Enable kprobe_multi feature if CONFIG_FPROBE is enabled Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 32/36] fprobe: Rewrite fprobe on function-graph tracer Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 33/36] tracing/fprobe: Remove nr_maxactive from fprobe Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 34/36] selftests: ftrace: Remove obsolate maxactive syntax check Masami Hiramatsu (Google)
2024-02-06 15:13 ` [PATCH v7 35/36] selftests/ftrace: Add a test case for repeating register/unregister fprobe Masami Hiramatsu (Google)
2024-02-06 15:14 ` [PATCH v7 36/36] Documentation: probes: Update fprobe on function-graph tracer Masami Hiramatsu (Google)
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=20240218005359.7072c27c99bcfe426e2126b6@kernel.org \
--to=mhiramat@kernel.org \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=guoren@kernel.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=peterz@infradead.org \
--cc=revest@chromium.org \
--cc=rostedt@goodmis.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
/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.