From: Ralf Jung <post@ralfj.de>
To: Andreas Hindborg <a.hindborg@kernel.org>
Cc: "Boqun Feng" <boqun.feng@gmail.com>, comex <comexk@gmail.com>,
"Alice Ryhl" <aliceryhl@google.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
dakr@kernel.org, robin.murphy@arm.com,
rust-for-linux@vger.kernel.org, "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Valentin Obst" <kernel@valentinobst.de>,
linux-kernel@vger.kernel.org, "Christoph Hellwig" <hch@lst.de>,
"Marek Szyprowski" <m.szyprowski@samsung.com>,
airlied@redhat.com, iommu@lists.linux.dev, lkmm@lists.linux.dev
Subject: Re: Allow data races on some read/write operations
Date: Wed, 5 Mar 2025 23:01:35 +0100 [thread overview]
Message-ID: <5141441e-040f-4ba3-8567-91110fa91df0@ralfj.de> (raw)
In-Reply-To: <87pliv726u.fsf@kernel.org>
Hi,
On 05.03.25 19:38, Andreas Hindborg wrote:
> "Ralf Jung" <post@ralfj.de> writes:
>
>> Hi,
>>
>> On 05.03.25 04:24, Boqun Feng wrote:
>>> On Tue, Mar 04, 2025 at 12:18:28PM -0800, comex wrote:
>>>>
>>>>> On Mar 4, 2025, at 11:03 AM, Ralf Jung <post@ralfj.de> wrote:
>>>>>
>>>>> Those already exist in Rust, albeit only unstably:
>>>>> <https://doc.rust-lang.org/nightly/std/intrinsics/fn.volatile_copy_memory.html>.
>>>>> However, I am not sure how you'd even generate such a call in C? The
>>>>> standard memcpy function is not doing volatile accesses, to my
>>>>> knowledge.
>>>>
>>>> The actual memcpy symbol that exists at runtime is written in
>>>> assembly, and should be valid to treat as performing volatile
>>>> accesses.
>>
>> memcpy is often written in C... and AFAIK compilers understand what that
>> function does and will, for instance, happily eliminate the call if they can
>> prove that the destination memory is not being read from again. So, it doesn't
>> behave like a volatile access at all.
>>
>>>> But both GCC and Clang special-case the memcpy function. For example,
>>>> if you call memcpy with a small constant as the size, the optimizer
>>>> will transform the call into one or more regular loads/stores, which
>>>> can then be optimized mostly like any other loads/stores (except for
>>>> opting out of alignment and type-based aliasing assumptions). Even if
>>>> the call isn’t transformed, the optimizer will still make assumptions.
>>>> LLVM will automatically mark memcpy `nosync`, which makes it undefined
>>>> behavior if the function “communicate[s] (synchronize[s]) with another
>>>> thread”, including through “volatile accesses”. [1]
>>
>> The question is more, what do clang and GCC document / guarantee in a stable
>> way regarding memcpy? I have not seen any indication so far that a memcpy call
>> would ever be considered volatile, so we have to treat it like a non-volatile
>> non-atomic operation.
>>
>>>> However, these optimizations should rarely trigger misbehavior in
>>>> practice, so I wouldn’t be surprised if Linux had some code that
>>>> expected memcpy to act volatile…
>>>>
>>>
>>> Also in this particular case we are discussing [1], it's a memcpy (from
>>> or to) a DMA buffer, which means the device can also read or write the
>>> memory, therefore the content of the memory may be altered outside the
>>> program (the kernel), so we cannot use copy_nonoverlapping() I believe.
>>>
>>> [1]: https://lore.kernel.org/rust-for-linux/87bjuil15w.fsf@kernel.org/
>>
>> Is there actually a potential for races (with reads by hardware, not other
>> threads) on the memcpy'd memory?
>
> There is another use case for this: copying data to/from a page that is
> mapped into user space. In this case, a user space process can
> potentially modify the data in the mapped page while we are
> reading/writing that data. This would be a misbehaved user space
> process, but it should not be able to cause UB in the kernel anyway.
Yeah that sounds like *the* prototypical case of sharing memory with an
untrusted third party.
>
> The C kernel just calls memcpy directly for this use case.
>
> For this use case, we do not interpret or make control flow decisions
> based on the data we read/write. And _if_ user space decides to do
> concurrent writes to the page, we don't care if the data becomes
> garbage. We just need the UB to be confined to the data moved from that
> page, and not leak into the rest of the kernel.
There is no such thing as "confined UB". Well, there is "poison data", which can
act a bit like that, but sadly the C standard is extremely ambiguous on that
subject and has been for decades despite repeated requests for clarifications,
so it is entirely unclear whether and how "poison data" could exist in C. clang,
for once, has decided that "poison data" is UB in most situations (including
just copying it to / returning it from another function), and this is consistent
with some of the messaging of the standards committee. I don't know enough about
the internals of gcc to comment on what they do.
Personally, I think that's a mistake; there needs to be some clear way to deal
with uninitialized memory (which is the typical example of "poison data").
In Rust we have a fairly clear idea of what our rules should be here, and you
can have "poison data" inside the `MaybeUninit` type. However, neither Rust nor
C have a way to do reads where data races cause "poison data" rather than UB.
See my other email I just sent for the rest of this line of discussion.
(I'm not used to the sprawling tree of a discussion that is this mailing list,
so not sure how to best deal with replies that want to "merge" things said in
different emails.)
Kind regards,
Ralf
next prev parent reply other threads:[~2025-03-05 22:01 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-24 11:49 [PATCH v12 0/3] rust: add dma coherent allocator abstraction Abdiel Janulgue
2025-02-24 11:49 ` [PATCH v12 1/3] rust: error: Add EOVERFLOW Abdiel Janulgue
2025-02-24 13:11 ` Andreas Hindborg
2025-02-24 11:49 ` [PATCH v12 2/3] rust: add dma coherent allocator abstraction Abdiel Janulgue
2025-02-24 13:21 ` Alice Ryhl
2025-02-24 16:27 ` Abdiel Janulgue
2025-02-24 13:30 ` QUENTIN BOYER
2025-02-24 16:30 ` Abdiel Janulgue
2025-02-24 14:40 ` Andreas Hindborg
2025-02-24 16:27 ` Abdiel Janulgue
2025-02-24 22:35 ` Daniel Almeida
2025-02-28 8:35 ` Alexandre Courbot
2025-02-28 10:01 ` Danilo Krummrich
2025-02-24 20:07 ` Benno Lossin
2025-02-24 21:40 ` Miguel Ojeda
2025-02-24 23:12 ` Daniel Almeida
2025-03-03 13:00 ` Andreas Hindborg
2025-03-03 13:13 ` Alice Ryhl
2025-03-03 15:21 ` Andreas Hindborg
2025-03-03 15:44 ` Alice Ryhl
2025-03-03 18:45 ` Andreas Hindborg
2025-03-03 19:00 ` Allow data races on some read/write operations Andreas Hindborg
2025-03-03 20:08 ` Boqun Feng
2025-03-04 19:03 ` Ralf Jung
2025-03-04 20:18 ` comex
2025-03-05 3:24 ` Boqun Feng
2025-03-05 13:10 ` Ralf Jung
2025-03-05 13:23 ` Alice Ryhl
2025-03-05 13:27 ` Ralf Jung
2025-03-05 14:40 ` Robin Murphy
2025-03-05 18:43 ` Andreas Hindborg
2025-03-05 19:30 ` Alan Stern
2025-03-05 19:42 ` Ralf Jung
2025-03-05 21:26 ` Andreas Hindborg
2025-03-05 21:53 ` Ralf Jung
2025-03-07 8:43 ` Andreas Hindborg
2025-03-18 14:44 ` Ralf Jung
2025-03-05 18:41 ` Andreas Hindborg
2025-03-05 14:25 ` Daniel Almeida
2025-03-05 18:38 ` Andreas Hindborg
2025-03-05 22:01 ` Ralf Jung [this message]
2025-03-04 8:28 ` [PATCH v12 2/3] rust: add dma coherent allocator abstraction Abdiel Janulgue
2025-02-25 8:15 ` Abdiel Janulgue
2025-02-25 9:09 ` Alice Ryhl
2025-02-24 22:05 ` Miguel Ojeda
2025-02-25 8:15 ` Abdiel Janulgue
2025-03-03 11:30 ` Andreas Hindborg
2025-03-04 8:58 ` Abdiel Janulgue
2025-03-03 13:08 ` Robin Murphy
2025-03-05 17:41 ` Jason Gunthorpe
2025-03-06 13:37 ` Danilo Krummrich
2025-03-06 15:21 ` Simona Vetter
2025-03-06 15:49 ` Danilo Krummrich
2025-03-06 15:54 ` Danilo Krummrich
2025-03-06 16:18 ` Jason Gunthorpe
2025-03-06 16:34 ` Danilo Krummrich
2025-03-07 10:20 ` Simona Vetter
2025-03-06 16:09 ` Jason Gunthorpe
2025-03-07 8:50 ` Danilo Krummrich
2025-03-07 10:18 ` Simona Vetter
2025-03-07 12:48 ` Jason Gunthorpe
2025-03-07 13:16 ` Simona Vetter
2025-03-07 14:38 ` Jason Gunthorpe
2025-03-07 17:30 ` Danilo Krummrich
2025-03-07 18:02 ` Greg Kroah-Hartman
2025-03-07 16:09 ` Danilo Krummrich
2025-03-07 16:57 ` Jason Gunthorpe
2025-03-07 19:03 ` Danilo Krummrich
2025-02-24 11:49 ` [PATCH v12 3/3] MAINTAINERS: add entry for Rust dma mapping helpers device driver API Abdiel Janulgue
2025-02-24 13:10 ` Andreas Hindborg
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=5141441e-040f-4ba3-8567-91110fa91df0@ralfj.de \
--to=post@ralfj.de \
--cc=a.hindborg@kernel.org \
--cc=abdiel.janulgue@gmail.com \
--cc=airlied@redhat.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=comexk@gmail.com \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=gary@garyguo.net \
--cc=hch@lst.de \
--cc=iommu@lists.linux.dev \
--cc=kernel@valentinobst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=lkmm@lists.linux.dev \
--cc=m.szyprowski@samsung.com \
--cc=ojeda@kernel.org \
--cc=robin.murphy@arm.com \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
/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
all inboxes | Powered by JetHome®