* [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
[not found] <20241220174731.514432-1-bigeasy@linutronix.de>
@ 2024-12-20 17:41 ` Sebastian Andrzej Siewior
2024-12-30 21:13 ` Petr Pavlu
2024-12-31 3:33 ` Elliot Berman
0 siblings, 2 replies; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2024-12-20 17:41 UTC (permalink / raw)
To: linux-modules, linux-kernel
Cc: Daniel Gomez, Luis Chamberlain, Paul E . McKenney, Peter Zijlstra,
Petr Pavlu, Sami Tolvanen, Thomas Gleixner,
Sebastian Andrzej Siewior, Elliot Berman, Kees Cook,
Nathan Chancellor, Steven Rostedt, llvm
__module_address() can be invoked within a RCU section, there is no
requirement to have preemption disabled.
I'm not sure if using rcu_read_lock() will introduce the regression that
has been fixed in commit 14c4c8e41511a ("cfi: Use
rcu_read_{un}lock_sched_notrace").
Cc: Elliot Berman <quic_eberman@quicinc.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Sami Tolvanen <samitolvanen@google.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: llvm@lists.linux.dev
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
kernel/cfi.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/kernel/cfi.c b/kernel/cfi.c
index 08caad7767176..c8f2b5a51b2e6 100644
--- a/kernel/cfi.c
+++ b/kernel/cfi.c
@@ -71,6 +71,10 @@ static bool is_module_cfi_trap(unsigned long addr)
struct module *mod;
bool found = false;
+ /*
+ * XXX this could be RCU protected but would it introcude the regression
+ * fixed in 14c4c8e41511a ("cfi: Use rcu_read_{un}lock_sched_notrace")
+ */
rcu_read_lock_sched_notrace();
mod = __module_address(addr);
--
2.45.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2024-12-20 17:41 ` [PATCH v2 28/28] cfi: Use RCU while invoking __module_address() Sebastian Andrzej Siewior
@ 2024-12-30 21:13 ` Petr Pavlu
2025-01-02 23:59 ` Sami Tolvanen
2024-12-31 3:33 ` Elliot Berman
1 sibling, 1 reply; 8+ messages in thread
From: Petr Pavlu @ 2024-12-30 21:13 UTC (permalink / raw)
To: Sebastian Andrzej Siewior, Sami Tolvanen
Cc: linux-modules, linux-kernel, Daniel Gomez, Luis Chamberlain,
Paul E . McKenney, Peter Zijlstra, Thomas Gleixner, Elliot Berman,
Kees Cook, Nathan Chancellor, Steven Rostedt, llvm
On 12/20/24 18:41, Sebastian Andrzej Siewior wrote:
> __module_address() can be invoked within a RCU section, there is no
> requirement to have preemption disabled.
>
> I'm not sure if using rcu_read_lock() will introduce the regression that
> has been fixed in commit 14c4c8e41511a ("cfi: Use
> rcu_read_{un}lock_sched_notrace").
>
> Cc: Elliot Berman <quic_eberman@quicinc.com>
> Cc: Kees Cook <kees@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Sami Tolvanen <samitolvanen@google.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: llvm@lists.linux.dev
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> kernel/cfi.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/kernel/cfi.c b/kernel/cfi.c
> index 08caad7767176..c8f2b5a51b2e6 100644
> --- a/kernel/cfi.c
> +++ b/kernel/cfi.c
> @@ -71,6 +71,10 @@ static bool is_module_cfi_trap(unsigned long addr)
> struct module *mod;
> bool found = false;
>
> + /*
> + * XXX this could be RCU protected but would it introcude the regression
> + * fixed in 14c4c8e41511a ("cfi: Use rcu_read_{un}lock_sched_notrace")
> + */
> rcu_read_lock_sched_notrace();
>
> mod = __module_address(addr);
I think that since 89245600941e ("cfi: Switch to -fsanitize=kcfi"), this
can be a call to rcu_read_lock_sched(), or in your case rcu_read_lock().
The recursive case where __cfi_slowpath_diag() could end up calling
itself is no longer present, as all that logic is gone. I then don't see
another reason this should use the notrace variant.
@Sami, could you please confirm this?
--
Thanks,
Petr
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2024-12-20 17:41 ` [PATCH v2 28/28] cfi: Use RCU while invoking __module_address() Sebastian Andrzej Siewior
2024-12-30 21:13 ` Petr Pavlu
@ 2024-12-31 3:33 ` Elliot Berman
2025-01-03 0:24 ` Sami Tolvanen
1 sibling, 1 reply; 8+ messages in thread
From: Elliot Berman @ 2024-12-31 3:33 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: linux-modules, linux-kernel, Daniel Gomez, Luis Chamberlain,
Paul E . McKenney, Peter Zijlstra, Petr Pavlu, Sami Tolvanen,
Thomas Gleixner, Elliot Berman, Kees Cook, Nathan Chancellor,
Steven Rostedt, llvm
On Fri, Dec 20, 2024 at 06:41:42PM +0100, Sebastian Andrzej Siewior wrote:
> __module_address() can be invoked within a RCU section, there is no
> requirement to have preemption disabled.
>
> I'm not sure if using rcu_read_lock() will introduce the regression that
> has been fixed in commit 14c4c8e41511a ("cfi: Use
> rcu_read_{un}lock_sched_notrace").
>
You can replace the rcu_read_lock_sched_notrace() with guard(rcu)().
Regular rcu lock doesn't generate function traces, so the recursive loop
isn't possible.
I've tested:
- the current kernel (no recursive loop)
- Revert back to rcu_read_lock_sched() (fails)
- Your series as-is (no recurisve loop)
- Replace with guard(rcu)() (no recursive loop)
Whether you'd like to stick with the current patch or replace with
guard(rcu)():
Tested-by: Elliot Berman <elliot.berman@oss.qualcomm.com> # sm8650-qrd
-
I don't know why I didn't mention steps to reproduce, even for my own
benefit. Lesson learned :)
Here are the steps to reproduce; you'll need a system with support for
CFI: qemu arm64 probably does the trick and you'll need clang>=16. I'm
happy to help test future revisions of this series since I have the
setup all done.
```
modprobe -a dummy_stm stm_ftrace stm_p_basic
mkdir -p /sys/kernel/config/stp-policy/dummy_stm.0.my-policy/default
echo function > /sys/kernel/tracing/current_tracer
echo 1 > /sys/kernel/tracing/tracing_on
echo dummy_stm.0 > /sys/class/stm_source/ftrace/stm_source_link
```
The trace buffer should not be full of stm calls due to the recursive
loop as mentioned in my original commit.
Regards,
Elliot Berman
> Cc: Elliot Berman <quic_eberman@quicinc.com>
> Cc: Kees Cook <kees@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Sami Tolvanen <samitolvanen@google.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: llvm@lists.linux.dev
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> kernel/cfi.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/kernel/cfi.c b/kernel/cfi.c
> index 08caad7767176..c8f2b5a51b2e6 100644
> --- a/kernel/cfi.c
> +++ b/kernel/cfi.c
> @@ -71,6 +71,10 @@ static bool is_module_cfi_trap(unsigned long addr)
> struct module *mod;
> bool found = false;
>
> + /*
> + * XXX this could be RCU protected but would it introcude the regression
> + * fixed in 14c4c8e41511a ("cfi: Use rcu_read_{un}lock_sched_notrace")
> + */
> rcu_read_lock_sched_notrace();
>
> mod = __module_address(addr);
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2024-12-30 21:13 ` Petr Pavlu
@ 2025-01-02 23:59 ` Sami Tolvanen
0 siblings, 0 replies; 8+ messages in thread
From: Sami Tolvanen @ 2025-01-02 23:59 UTC (permalink / raw)
To: Petr Pavlu
Cc: Sebastian Andrzej Siewior, linux-modules, linux-kernel,
Daniel Gomez, Luis Chamberlain, Paul E . McKenney, Peter Zijlstra,
Thomas Gleixner, Elliot Berman, Kees Cook, Nathan Chancellor,
Steven Rostedt, llvm
Hi Petr,
On Mon, Dec 30, 2024 at 1:13 PM Petr Pavlu <petr.pavlu@suse.com> wrote:
>
> On 12/20/24 18:41, Sebastian Andrzej Siewior wrote:
> > __module_address() can be invoked within a RCU section, there is no
> > requirement to have preemption disabled.
> >
> > I'm not sure if using rcu_read_lock() will introduce the regression that
> > has been fixed in commit 14c4c8e41511a ("cfi: Use
> > rcu_read_{un}lock_sched_notrace").
> >
> > Cc: Elliot Berman <quic_eberman@quicinc.com>
> > Cc: Kees Cook <kees@kernel.org>
> > Cc: Nathan Chancellor <nathan@kernel.org>
> > Cc: Sami Tolvanen <samitolvanen@google.com>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: llvm@lists.linux.dev
> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > ---
> > kernel/cfi.c | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/kernel/cfi.c b/kernel/cfi.c
> > index 08caad7767176..c8f2b5a51b2e6 100644
> > --- a/kernel/cfi.c
> > +++ b/kernel/cfi.c
> > @@ -71,6 +71,10 @@ static bool is_module_cfi_trap(unsigned long addr)
> > struct module *mod;
> > bool found = false;
> >
> > + /*
> > + * XXX this could be RCU protected but would it introcude the regression
> > + * fixed in 14c4c8e41511a ("cfi: Use rcu_read_{un}lock_sched_notrace")
> > + */
> > rcu_read_lock_sched_notrace();
> >
> > mod = __module_address(addr);
>
> I think that since 89245600941e ("cfi: Switch to -fsanitize=kcfi"), this
> can be a call to rcu_read_lock_sched(), or in your case rcu_read_lock().
> The recursive case where __cfi_slowpath_diag() could end up calling
> itself is no longer present, as all that logic is gone. I then don't see
> another reason this should use the notrace variant.
>
> @Sami, could you please confirm this?
Switching is_module_cfi_trap() to use rcu_read_lock() in this series
should be fine. KCFI checks don't perform function calls, so there's
no risk of recursion, and this function is only called during the
error handling path.
Sami
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2024-12-31 3:33 ` Elliot Berman
@ 2025-01-03 0:24 ` Sami Tolvanen
2025-01-06 18:00 ` Elliot Berman
0 siblings, 1 reply; 8+ messages in thread
From: Sami Tolvanen @ 2025-01-03 0:24 UTC (permalink / raw)
To: Elliot Berman
Cc: Sebastian Andrzej Siewior, linux-modules, linux-kernel,
Daniel Gomez, Luis Chamberlain, Paul E . McKenney, Peter Zijlstra,
Petr Pavlu, Thomas Gleixner, Elliot Berman, Kees Cook,
Nathan Chancellor, Steven Rostedt, llvm
Hi Elliot,
On Mon, Dec 30, 2024 at 7:33 PM Elliot Berman
<elliot.berman@oss.qualcomm.com> wrote:
>
> On Fri, Dec 20, 2024 at 06:41:42PM +0100, Sebastian Andrzej Siewior wrote:
> > __module_address() can be invoked within a RCU section, there is no
> > requirement to have preemption disabled.
> >
> > I'm not sure if using rcu_read_lock() will introduce the regression that
> > has been fixed in commit 14c4c8e41511a ("cfi: Use
> > rcu_read_{un}lock_sched_notrace").
> >
>
> You can replace the rcu_read_lock_sched_notrace() with guard(rcu)().
> Regular rcu lock doesn't generate function traces, so the recursive loop
> isn't possible.
>
> I've tested:
> - the current kernel (no recursive loop)
> - Revert back to rcu_read_lock_sched() (fails)
Which kernel version did you test? I assume something pre-KCFI as
arm64 doesn't use this code since v6.1.
> - Your series as-is (no recurisve loop)
Note that this patch only adds a comment to is_module_cfi_trap(), so I
wouldn't expect a functional change.
Sami
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2025-01-03 0:24 ` Sami Tolvanen
@ 2025-01-06 18:00 ` Elliot Berman
2025-01-06 21:24 ` Sami Tolvanen
0 siblings, 1 reply; 8+ messages in thread
From: Elliot Berman @ 2025-01-06 18:00 UTC (permalink / raw)
To: Sami Tolvanen
Cc: Sebastian Andrzej Siewior, linux-modules, linux-kernel,
Daniel Gomez, Luis Chamberlain, Paul E . McKenney, Peter Zijlstra,
Petr Pavlu, Thomas Gleixner, Elliot Berman, Kees Cook,
Nathan Chancellor, Steven Rostedt, llvm
On Thu, Jan 02, 2025 at 04:24:22PM -0800, Sami Tolvanen wrote:
> Hi Elliot,
>
> On Mon, Dec 30, 2024 at 7:33 PM Elliot Berman
> <elliot.berman@oss.qualcomm.com> wrote:
> >
> > On Fri, Dec 20, 2024 at 06:41:42PM +0100, Sebastian Andrzej Siewior wrote:
> > > __module_address() can be invoked within a RCU section, there is no
> > > requirement to have preemption disabled.
> > >
> > > I'm not sure if using rcu_read_lock() will introduce the regression that
> > > has been fixed in commit 14c4c8e41511a ("cfi: Use
> > > rcu_read_{un}lock_sched_notrace").
> > >
> >
> > You can replace the rcu_read_lock_sched_notrace() with guard(rcu)().
> > Regular rcu lock doesn't generate function traces, so the recursive loop
> > isn't possible.
> >
> > I've tested:
> > - the current kernel (no recursive loop)
> > - Revert back to rcu_read_lock_sched() (fails)
>
> Which kernel version did you test? I assume something pre-KCFI as
> arm64 doesn't use this code since v6.1.
>
Ah, thanks for calling me out. I dug a bit more, I thought I was looking
at a recursive loop in the ftrace buffers, but was actually the expected
behavior. When I tested on the other configurations, the stm dummy
driver hadn't kicked in yet by the time I looked at the ftrace. Indeed,
this function code is not used on arm64.
I experimented with an x86 build as well and I was able to get the hang
I remember seeing after some tweaks to force a CFI failure. Still,
guard(rcu)() is okay by me :)
> > - Your series as-is (no recurisve loop)
>
> Note that this patch only adds a comment to is_module_cfi_trap(), so I
> wouldn't expect a functional change.
>
Agreed I wouldn't expect it to make any issues; I mentioned it for
completeness sake.
Regards,
Elliot
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2025-01-06 18:00 ` Elliot Berman
@ 2025-01-06 21:24 ` Sami Tolvanen
2025-01-07 15:44 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 8+ messages in thread
From: Sami Tolvanen @ 2025-01-06 21:24 UTC (permalink / raw)
To: Elliot Berman
Cc: Sebastian Andrzej Siewior, linux-modules, linux-kernel,
Daniel Gomez, Luis Chamberlain, Paul E . McKenney, Peter Zijlstra,
Petr Pavlu, Thomas Gleixner, Elliot Berman, Kees Cook,
Nathan Chancellor, Steven Rostedt, llvm
Hi,
On Mon, Jan 6, 2025 at 10:00 AM Elliot Berman
<elliot.berman@oss.qualcomm.com> wrote:
>
> On Thu, Jan 02, 2025 at 04:24:22PM -0800, Sami Tolvanen wrote:
> > Hi Elliot,
> >
> > On Mon, Dec 30, 2024 at 7:33 PM Elliot Berman
> > <elliot.berman@oss.qualcomm.com> wrote:
> > >
> > > On Fri, Dec 20, 2024 at 06:41:42PM +0100, Sebastian Andrzej Siewior wrote:
> > > > __module_address() can be invoked within a RCU section, there is no
> > > > requirement to have preemption disabled.
> > > >
> > > > I'm not sure if using rcu_read_lock() will introduce the regression that
> > > > has been fixed in commit 14c4c8e41511a ("cfi: Use
> > > > rcu_read_{un}lock_sched_notrace").
> > > >
> > >
> > > You can replace the rcu_read_lock_sched_notrace() with guard(rcu)().
> > > Regular rcu lock doesn't generate function traces, so the recursive loop
> > > isn't possible.
> > >
> > > I've tested:
> > > - the current kernel (no recursive loop)
> > > - Revert back to rcu_read_lock_sched() (fails)
> >
> > Which kernel version did you test? I assume something pre-KCFI as
> > arm64 doesn't use this code since v6.1.
> >
>
> Ah, thanks for calling me out. I dug a bit more, I thought I was looking
> at a recursive loop in the ftrace buffers, but was actually the expected
> behavior. When I tested on the other configurations, the stm dummy
> driver hadn't kicked in yet by the time I looked at the ftrace. Indeed,
> this function code is not used on arm64.
>
> I experimented with an x86 build as well and I was able to get the hang
> I remember seeing after some tweaks to force a CFI failure. Still,
> guard(rcu)() is okay by me :)
OK, great. That makes sense. Thanks for taking the time to test this!
Sami
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 28/28] cfi: Use RCU while invoking __module_address().
2025-01-06 21:24 ` Sami Tolvanen
@ 2025-01-07 15:44 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-01-07 15:44 UTC (permalink / raw)
To: Sami Tolvanen
Cc: Elliot Berman, linux-modules, linux-kernel, Daniel Gomez,
Luis Chamberlain, Paul E . McKenney, Peter Zijlstra, Petr Pavlu,
Thomas Gleixner, Elliot Berman, Kees Cook, Nathan Chancellor,
Steven Rostedt, llvm
On 2025-01-06 13:24:28 [-0800], Sami Tolvanen wrote:
> Hi,
Hi,
> OK, great. That makes sense. Thanks for taking the time to test this!
Thank you two for testing, confirming and adding more informations to
what and why. I take some of this for the patch description.
> Sami
Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-01-07 15:44 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20241220174731.514432-1-bigeasy@linutronix.de>
2024-12-20 17:41 ` [PATCH v2 28/28] cfi: Use RCU while invoking __module_address() Sebastian Andrzej Siewior
2024-12-30 21:13 ` Petr Pavlu
2025-01-02 23:59 ` Sami Tolvanen
2024-12-31 3:33 ` Elliot Berman
2025-01-03 0:24 ` Sami Tolvanen
2025-01-06 18:00 ` Elliot Berman
2025-01-06 21:24 ` Sami Tolvanen
2025-01-07 15:44 ` Sebastian Andrzej Siewior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox