Re: [PATCH v6 9/9] rust: sync: atomic: Add Atomic<{usize,isize}>
Boqun Feng <[email protected]> Fri, 11 Jul 2025 08:46:59 -0700
| Newsgroups | dev.linux.lists.lkmm,org.kernel.vger.linux-arch,org.kernel.vger.linux-kernel,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Jul 11, 2025 at 04:40:15PM +0200, Miguel Ojeda wrote: > On Fri, Jul 11, 2025 at 4:07 PM Boqun Feng <[email protected]> wrote: > > > > Thanks Miguel. > > > > Maybe we can do even better: having a type alias mapping to the exact > > i{32,64,128} based on kernel configs? Like > > > > (in kernel/lib.rs or ffi.rs) > > > > // Want to buy a better name ;-) > > #[cfg(CONFIG_128BIT)] > > type isize_mapping = i128; > > #[cfg(CONFIG_64BIT)] > > type isize_mapping = i64; > > #[cfg(not(any(CONFIG_128BIT, CONFIG_64BIT)))] > > type isize_mapping = i32; > > > > similar for usize. > > > > Thoughts? > > Yeah, I wondered about that too, but I don't know how common it will > be (so you may want to keep it local anyway), and I wasn't sure what Sounds good, I will put it locally. > to call it either, because e.g. something like `isize_mapping` sounds > like we are talking about `c_long`. > > What we want is a Rust fixed-width integer of the same size of `isize` > -- so I think you should try to pick a word that evokes a bit that > part. Something like `fixed_isize` or words like `underlying` or > `repr` perhaps? > I end up calling it `isize_atomic_repr`, and create the diff as below: ------------>8 diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs index 7ff87b2b49d6..bb0d3d49e3f7 100644 --- a/rust/kernel/sync/atomic.rs +++ b/rust/kernel/sync/atomic.rs @@ -53,14 +53,21 @@ fn delta_into_repr(d: Self::Delta) -> Self::Repr { } } +#[allow(non_camel_case_types)] +#[cfg(not(CONFIG_64BIT))] +type isize_atomic_repr = i32; +#[allow(non_camel_case_types)] +#[cfg(CONFIG_64BIT)] +type isize_atomic_repr = i64; + +crate::static_assert!(core::mem::size_of::<isize>() == core::mem::size_of::<isize_atomic_repr>()); +crate::static_assert!(core::mem::align_of::<isize>() == core::mem::align_of::<isize_atomic_repr>()); + // SAFETY: For 32bit kernel, `isize` has the same size and alignment with `i32` and is round-trip // transmutable to it, for 64bit kernel `isize` has the same size and alignment with `i64` and is // round-trip transmutable to it. unsafe impl generic::AllowAtomic for isize { - #[cfg(not(CONFIG_64BIT))] - type Repr = i32; - #[cfg(CONFIG_64BIT)] - type Repr = i64; + type Repr = isize_atomic_repr; } // SAFETY: `isize` is always sound to transmute back from `i32` or `i64` when their sizes are the Seems good? Regards, Boqun > Cheers, > Miguel