All of lore.kernel.org
 help / color / mirror / Atom feed
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: Tue, 24 Jun 2025 09:35:21 -0700	[thread overview]
Message-ID: <aFrTyXcFVOjWa2o-@Mac.home> (raw)
In-Reply-To: <DAUAW2Y0HYLY.3CDC9ZW0BUKI4@kernel.org>

On Tue, Jun 24, 2025 at 01:27:38AM +0200, Benno Lossin wrote:
> On Mon Jun 23, 2025 at 9:09 PM CEST, Boqun Feng wrote:
> > On Mon, Jun 23, 2025 at 07:30:19PM +0100, Gary Guo wrote:
> >> cannot just transmute between from pointers to usize (which is its
> >> Repr):
> >> * Transmuting from pointer to usize discards provenance
> >> * Transmuting from usize to pointer gives invalid provenance
> >> 
> >> We want neither behaviour, so we must store `usize` directly and
> >> always call into repr functions.
> >> 
> >
> > If we store `usize`, how can we support the `get_mut()` then? E.g.
> >
> >     static V: i32 = 32;
> >
> >     let mut x = Atomic::new(&V as *const i32 as *mut i32);
> >     // ^ assume we expose_provenance() in new().
> >
> >     let ptr: &mut *mut i32 = x.get_mut(); // which is `&mut self.0.get()`.
> >
> >     let ptr_val = *ptr; // Does `ptr_val` have the proper provenance?
> 
> If `get_mut` transmutes the integer into a pointer, then it will have
> the wrong provenance (it will just have plain invalid provenance).
> 

The key topic Gary and I have been discussing is whether we should
define Atomic<T> as:

(my current implementation)

    pub struct Atomic<T: AllowAtomic>(Opaque<T>);

or

(Gary's suggestion)

    pub struct Atomic<T: AllowAtomic>(Opaque<T::Repr>);

`T::Repr` is guaranteed to be the same size and alignment of `T`, and
per our discussion, it makes sense to further require that `transmute<T,
T::Repr>()` should also be safe (as the safety requirement of
`AllowAtomic`), or we can say `T` bit validity can be preserved by
`T::Repr`: a valid bit combination `T` can be transumated to `T::Repr`,
and if transumated back, it's the same bit combination.

Now as I pointed out, if we use `Opaque<T::Repr>`, then `.get_mut()`
would be unsound for `Atomic<*mut T>`. And Gary's concern is that in
the current implementation, we directly cast a `*mut T` (from
`Opaque::get()`) into a `*mut T::Repr`, and pass it directly into C/asm
atomic primitives. However, I think with the additional safety
requirement above, this shouldn't be a problem: because the C/asm atomic
primitives would just pass the address to an asm block, and that'll be
out of Rust abstract machine, and as long as the C/primitives atomic
primitives are implemented correctly, the bit representation of `T`
remains valid after asm blocks.

So I think the current implementation still works and is better.

Regards,
Boqun

> ---
> Cheers,
> Benno

  reply	other threads:[~2025-06-24 16:35 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 [this message]
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
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=aFrTyXcFVOjWa2o-@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 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.