From: Boqun Feng <boqun.feng@gmail.com>
To: Benno Lossin <lossin@kernel.org>
Cc: "Gary Guo" <gary@garyguo.net>,
linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org,
lkmm@lists.linux.dev, linux-arch@vger.kernel.org,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Will Deacon" <will@kernel.org>,
"Peter Zijlstra" <peterz@infradead.org>,
"Mark Rutland" <mark.rutland@arm.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Viresh Kumar" <viresh.kumar@linaro.org>,
"Lyude Paul" <lyude@redhat.com>, "Ingo Molnar" <mingo@kernel.org>,
"Mitchell Levy" <levymitchell0@gmail.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Linus Torvalds" <torvalds@linux-foundation.org>,
"Thomas Gleixner" <tglx@linutronix.de>
Subject: Re: [PATCH v5 04/10] rust: sync: atomic: Add generic atomics
Date: Sat, 5 Jul 2025 08:38:46 -0700 [thread overview]
Message-ID: <aGlHBqoqTA2PCXbJ@Mac.home> (raw)
In-Reply-To: <DB3YRHR9RN8Z.29926G08T7KZ0@kernel.org>
On Sat, Jul 05, 2025 at 10:04:04AM +0200, Benno Lossin wrote:
[...]
> >> >
> >> > Basically, what I'm trying to prove is that we can have a provenance-
> >> > preserved Atomic<*mut T> implementation based on the C atomics. Either
> >> > that is true, or we should write our own atomic pointer implementation.
> >>
> >> That much I remembered :) But since you were going into the specifics
> >> above, I think we should try to be correct. But maybe natural language
> >> is the wrong medium for that, just write the rust code and we'll see...
> >>
> >
> > I don't thinking writing rust code can help us here other than duplicate
> > my reasoning above, so like:
> >
> > ipml *mut() {
> > pub fn xchg(ptr: *mut *mut (), new: *mut ()) -> *mut () {
> > // SAFTEY: ..
Note: provenance preserving is not about the safety of Atomic<*mut T>
implementation, even if we don't preserve the provenance, calling
`Atomic<*mut T>` function won't cause UB, it's just that any pointer you
get from `Atomic<*mut T>` is a pointer without provenance.
So what I meant in this example is all the safey comment is above and
the rest is not a safe comment.
Hope it's clear.
> > // `atomic_long_xchg()` is implemented as asm(), so it can
> > // be treated as a normal pointer swap() hence preserve the
> > // provenance.
>
> Oh I think Gary was talking specifically about Rust's `asm!`. I don't
> know if C asm is going to play the same way... (inside LLVM they
> probably are the same thing, but in the abstract machine?)
>
You need to understand why Rust abstract machine model `asm!()` in
that way: Rust abstract machine cannot see through `asm!()`, so it has
to assume that `asm!() block can do anything that some equivalent Rust
code does. Further more, this "can do anything that some equivalent Rust
code does" is only one way to reason, the core part about this is Rust
will be very conservative when using the `asm!()` result for
optimization.
It should apply to C asm!() as well because LLVM cannot know see through
the asm block either. And based on the spirit, it might apply to any C
code as well, because it's outside Rust abstract machine. But if you
don't agree the reasoning, then we just cannot implement Atomic<*mut T>
with the existing C API.
> > unsafe { atomic_long_xchg(ptr.cast::<atomic_long_t>(), new as ffi:c_long) }
> > }
> >
> > pub fn cmpxchg(ptr: *mut *mut (), old: *mut (), new: *mut ()) -> *mut () {
> > // SAFTEY: ..
> > // `atomic_long_xchg()` is implemented as asm(), so it can
> > // be treated as a normal pointer compare_exchange() hence preserve the
> > // provenance.
> > unsafe { atomic_long_cmpxchg(ptr.cast::<atomic_long_t>(), old as ffi::c_long, new as ffi:c_long) }
> > }
> >
> > <do it for a lot of functions>
> > }
> >
> > So I don't think that approach is worth doing. Again the provenance
> > preserving is a global property, either we have it as whole or we don't
> > have it, and adding precise comment of each function call won't change
> > the result. I don't see much difference between reasoning about a set of
> > functions vs. reasoning one function by one function with the same
> > reasoning.
> >
> > If we have a reason to believe that C atomic doesn't support this we
> > just need to move to our own implementation. I know you (and probably
> > Gary) may feel the reasoning about provenance preserving a bit handwavy,
>
> YES :)
>
> > but this is probably the best we can get, and it's technically better
>
> I think we can at improve the safety docs situation.
>
Once again, it's not about the safety of Atomic<*mut T> implementation.
> > than using Rust native atomics, because that's just UB and no one would
> > help you.
>
> I'm not arguing using those :)
>
> > (I made a copy-pasta on purpose above, just to make another point why
> > writing each function out is not worth)
>
> Yeah that's true, but at the moment that safety comment is on the `impl`
> block? I don't think that's the right place...
>
Feel free to send any patch that improves this in your opinion ;-)
Regards,
Boqun
> ---
> Cheers,
> Benno
next prev parent reply other threads:[~2025-07-05 15:38 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-18 16:49 [PATCH v5 00/10] LKMM generic atomics in Rust Boqun Feng
2025-06-18 16:49 ` [PATCH v5 01/10] rust: Introduce atomic API helpers Boqun Feng
2025-06-26 8:44 ` Andreas Hindborg
2025-06-27 14:00 ` Boqun Feng
2025-06-18 16:49 ` [PATCH v5 02/10] rust: sync: Add basic atomic operation mapping framework Boqun Feng
2025-06-26 8:50 ` Andreas Hindborg
2025-06-26 10:17 ` Andreas Hindborg
2025-06-27 14:30 ` Boqun Feng
2025-06-18 16:49 ` [PATCH v5 03/10] rust: sync: atomic: Add ordering annotation types Boqun Feng
2025-06-19 10:31 ` Peter Zijlstra
2025-06-19 12:19 ` Alice Ryhl
2025-06-19 13:29 ` Boqun Feng
2025-06-19 14:32 ` Peter Zijlstra
2025-06-19 15:00 ` Boqun Feng
2025-06-19 15:10 ` Peter Zijlstra
2025-06-19 15:15 ` Boqun Feng
2025-06-19 18:04 ` Alan Stern
2025-06-21 11:18 ` Gary Guo
2025-06-23 2:48 ` Boqun Feng
2025-06-26 12:36 ` Andreas Hindborg
2025-06-27 14:34 ` Boqun Feng
2025-06-27 14:44 ` Boqun Feng
2025-06-18 16:49 ` [PATCH v5 04/10] rust: sync: atomic: Add generic atomics Boqun Feng
2025-06-21 11:32 ` Gary Guo
2025-06-23 5:19 ` Boqun Feng
2025-06-23 11:54 ` Benno Lossin
2025-06-23 12:58 ` Boqun Feng
2025-06-23 18:30 ` Gary Guo
2025-06-23 19:09 ` Boqun Feng
2025-06-23 23:27 ` Benno Lossin
2025-06-24 16:35 ` Boqun Feng
2025-06-26 13:54 ` Benno Lossin
2025-07-04 21:22 ` Boqun Feng
2025-07-04 22:05 ` Benno Lossin
2025-07-04 22:30 ` Boqun Feng
2025-07-04 22:49 ` Benno Lossin
2025-07-04 23:21 ` Boqun Feng
2025-07-04 20:25 ` Boqun Feng
2025-07-04 20:45 ` Benno Lossin
2025-07-04 21:17 ` Boqun Feng
2025-07-04 22:38 ` Benno Lossin
2025-07-04 23:21 ` Boqun Feng
2025-07-05 8:04 ` Benno Lossin
2025-07-05 15:38 ` Boqun Feng [this message]
2025-07-05 21:43 ` Benno Lossin
2025-06-26 12:15 ` Andreas Hindborg
2025-06-27 15:01 ` Boqun Feng
2025-06-30 9:52 ` Andreas Hindborg
2025-06-30 14:44 ` Alan Stern
2025-07-01 8:54 ` Andreas Hindborg
2025-07-01 14:50 ` Boqun Feng
2025-07-02 8:33 ` Andreas Hindborg
2025-06-18 16:49 ` [PATCH v5 05/10] rust: sync: atomic: Add atomic {cmp,}xchg operations Boqun Feng
2025-06-21 11:37 ` Gary Guo
2025-06-23 5:23 ` Boqun Feng
2025-06-26 13:12 ` Andreas Hindborg
2025-06-28 3:03 ` Boqun Feng
2025-06-30 10:16 ` Andreas Hindborg
2025-06-30 14:51 ` Alan Stern
2025-06-30 15:12 ` Boqun Feng
2025-06-27 8:58 ` Benno Lossin
2025-06-27 13:53 ` Boqun Feng
2025-06-28 6:12 ` Benno Lossin
2025-06-28 7:31 ` Boqun Feng
2025-06-28 8:00 ` Benno Lossin
2025-06-30 15:24 ` Boqun Feng
2025-06-30 15:27 ` Boqun Feng
2025-06-30 15:50 ` Benno Lossin
2025-06-18 16:49 ` [PATCH v5 06/10] rust: sync: atomic: Add the framework of arithmetic operations Boqun Feng
2025-06-21 11:41 ` Gary Guo
2025-06-26 12:39 ` Andreas Hindborg
2025-06-28 3:04 ` Boqun Feng
2025-06-18 16:49 ` [PATCH v5 07/10] rust: sync: atomic: Add Atomic<u{32,64}> Boqun Feng
2025-06-26 12:47 ` Andreas Hindborg
2025-06-18 16:49 ` [PATCH v5 08/10] rust: sync: atomic: Add Atomic<{usize,isize}> Boqun Feng
2025-06-26 12:49 ` Andreas Hindborg
2025-06-18 16:49 ` [PATCH v5 09/10] rust: sync: atomic: Add Atomic<*mut T> Boqun Feng
2025-06-18 16:49 ` [PATCH v5 10/10] rust: sync: Add memory barriers Boqun Feng
2025-06-26 13:36 ` Andreas Hindborg
2025-06-28 3:42 ` Boqun Feng
2025-06-30 9:54 ` Andreas Hindborg
2025-06-18 20:22 ` [PATCH v5 00/10] LKMM generic atomics in Rust Alice Ryhl
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=aGlHBqoqTA2PCXbJ@Mac.home \
--to=boqun.feng@gmail.com \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=dakr@kernel.org \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=levymitchell0@gmail.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lkmm@lists.linux.dev \
--cc=lossin@kernel.org \
--cc=lyude@redhat.com \
--cc=mark.rutland@arm.com \
--cc=mingo@kernel.org \
--cc=ojeda@kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=tmgross@umich.edu \
--cc=torvalds@linux-foundation.org \
--cc=viresh.kumar@linaro.org \
--cc=wedsonaf@gmail.com \
--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 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).