From: Catalin Marinas <catalin.marinas@arm.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>,
Luo Gengkun <luogengkun@huaweicloud.com>,
mhiramat@kernel.org, mathieu.desnoyers@efficios.com,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org,
Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH] tracing: Fix tracing_marker may trigger page fault during preempt_disable
Date: Mon, 1 Sep 2025 13:28:01 +0100 [thread overview]
Message-ID: <aLWRUTFeumwr1--E@arm.com> (raw)
In-Reply-To: <aLVt30-Lc9lesqS6@J2N7QTR9R3>
On Mon, Sep 01, 2025 at 10:56:47AM +0100, Mark Rutland wrote:
> On Sat, Aug 30, 2025 at 11:22:51AM +0100, Catalin Marinas wrote:
> > On Fri, Aug 29, 2025 at 06:13:11PM -0400, Steven Rostedt wrote:
> > > On Fri, 29 Aug 2025 20:53:40 +0100
> > > Catalin Marinas <catalin.marinas@arm.com> wrote:
> > > valid user address.
> > > > BTW, arm64 also bails out early in do_page_fault() if in_atomic() but I
> > > > suspect that's not the case here.
> > > >
> > > > Adding Al Viro since since he wrote a large part of uaccess.h.
> > >
> > > So, __copy_from_user_inatomic() is supposed to be called if
> > > pagefault_disable() has already been called? If this is the case, can we
> > > add more comments to this code? I've been using the inatomic() version this
> > > way in preempt disabled locations since 2016.
> >
> > This should work as long as in_atomic() returns true as it's checked in
> > the arm64 fault code. With PREEMPT_NONE, however, I don't think this
> > works.
>
> Sorry, what exactly breaks for the PREEMPT_NONE case?
This code would trigger a warning:
preempt_disable();
WARN_ON(!in_atomic());
preempt_enable();
More importantly, a faulting __copy_from_user_inatomic() between
get/put_cpu() could trigger migration.
> > > I just wanted to figure out why __copy_from_user_inatomic() wasn't atomic.
> > > If anything, it needs to be better documented.
> >
> > Yeah, I had no idea until I looked at the code. I guess it means it can
> > be safely used if in_atomic() == true (well, making it up, not sure what
> > the intention was).
>
> I think that was the intention -- it's the caller asserting that they
> know the access won't fault (and hence won't sleep), and that's why
> __copy_to_user_inatomic() and __copy_to_user() only differ by the latter
> calling might_sleep().
>
> It looks like other inconsistencies have crept in by accident. AFAICT
> the should_fail_usercopy() check in __copy_from_user() was accidentally
> missed from __copy_from_user_inatomic() when it was introduced in
> commit:
I was wondering about that but some code comment for the inatomic
variant states that it's the responsibility of the caller to ensure it
doesn't fault. Not sure one can do other than pinning the page _and_
taking the mm lock. So I agree we should add the fault injection here as
well.
> ... so there's a bunch of scope for cleanup, and we could probably have:
>
> /*
> * TODO: comment saying to only call this directly when you know
> * that the fault handler won't sleep.
> */
> static __always_inline __must_check unsigned long
> __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
> {
> ...
> }
>
> static __always_inline __must_check unsigned long
> __copy_from_user(void *to, const void __user *from, unsigned long n)
> {
> might_fault();
> return __copy_from_user_inatomic();
> }
>
> ... to avoid the inconsistency.
I think the _inatomic variant should be reserved to arch code that knows
the conditions. Generic code/drivers may not necessarily be aware of
what the arch fault handler does. The _nofault API I think is better
suited in generic code.
--
Catalin
next prev parent reply other threads:[~2025-09-01 15:10 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-19 10:51 [PATCH] tracing: Fix tracing_marker may trigger page fault during preempt_disable Luo Gengkun
2025-08-19 17:50 ` Steven Rostedt
2025-08-29 8:29 ` Luo Gengkun
2025-08-29 12:26 ` Steven Rostedt
2025-08-29 12:36 ` Steven Rostedt
2025-08-29 19:53 ` Catalin Marinas
2025-08-29 22:13 ` Steven Rostedt
2025-08-30 10:22 ` Catalin Marinas
2025-09-01 9:56 ` Mark Rutland
2025-09-01 12:28 ` Catalin Marinas [this message]
2025-09-01 13:07 ` Mark Rutland
2025-09-01 9:43 ` Mark Rutland
2025-09-02 14:11 ` Steven Rostedt
2025-09-01 16:01 ` Masami Hiramatsu
2025-09-01 15:56 ` Masami Hiramatsu
2025-09-02 3:47 ` Luo Gengkun
2025-09-02 7:35 ` Masami Hiramatsu
2025-09-02 14:14 ` 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=aLWRUTFeumwr1--E@arm.com \
--to=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=luogengkun@huaweicloud.com \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=rostedt@goodmis.org \
--cc=viro@zeniv.linux.org.uk \
--cc=will@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 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.