All of lore.kernel.org
 help / color / mirror / Atom feed
From: Elle Rhumsaa <elle@weathered-steel.dev>
To: Boqun Feng <boqun.feng@gmail.com>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	lkmm@lists.linux.dev, "Will Deacon" <will@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	stern@rowland.harvard.edu, "Miguel Ojeda" <ojeda@kernel.org>,
	alex.gaynor@gmail.com, "Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>
Subject: Re: [PATCH 07/14] rust: sync: atomic: Add Atomic<u{32,64}>
Date: Sat, 6 Sep 2025 04:24:09 +0000	[thread overview]
Message-ID: <aLu3aSdLwC8dInnh@archiso> (raw)
In-Reply-To: <20250905044141.77868-8-boqun.feng@gmail.com>

On Thu, Sep 04, 2025 at 09:41:34PM -0700, Boqun Feng wrote:
> Add generic atomic support for basic unsigned types that have an
> `AtomicImpl` with the same size and alignment.
> 
> Unit tests are added including Atomic<i32> and Atomic<i64>.
> 
> Reviewed-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org>
> Reviewed-by: Benno Lossin <lossin@kernel.org>
> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
> Link: https://lore.kernel.org/all/20250719030827.61357-8-boqun.feng@gmail.com/
> ---
>  rust/kernel/sync/atomic/predefine.rs | 95 ++++++++++++++++++++++++++++
>  1 file changed, 95 insertions(+)
> 
> diff --git a/rust/kernel/sync/atomic/predefine.rs b/rust/kernel/sync/atomic/predefine.rs
> index a6e5883be7cb..d0875812f6ad 100644
> --- a/rust/kernel/sync/atomic/predefine.rs
> +++ b/rust/kernel/sync/atomic/predefine.rs
> @@ -27,3 +27,98 @@ fn rhs_into_delta(rhs: i64) -> i64 {
>          rhs
>      }
>  }
> +
> +// SAFETY: `u32` and `i32` has the same size and alignment, and `u32` is round-trip transmutable to
> +// `i32`.
> +unsafe impl super::AtomicType for u32 {
> +    type Repr = i32;
> +}
> +
> +// SAFETY: The wrapping add result of two `i32`s is a valid `u32`.
> +unsafe impl super::AtomicAdd<u32> for u32 {
> +    fn rhs_into_delta(rhs: u32) -> i32 {
> +        rhs as i32
> +    }
> +}
> +
> +// SAFETY: `u64` and `i64` has the same size and alignment, and `u64` is round-trip transmutable to
> +// `i64`.
> +unsafe impl super::AtomicType for u64 {
> +    type Repr = i64;
> +}
> +
> +// SAFETY: The wrapping add result of two `i64`s is a valid `u64`.
> +unsafe impl super::AtomicAdd<u64> for u64 {
> +    fn rhs_into_delta(rhs: u64) -> i64 {
> +        rhs as i64
> +    }
> +}
> +
> +use crate::macros::kunit_tests;
> +
> +#[kunit_tests(rust_atomics)]
> +mod tests {
> +    use super::super::*;
> +
> +    // Call $fn($val) with each $type of $val.
> +    macro_rules! for_each_type {
> +        ($val:literal in [$($type:ty),*] $fn:expr) => {
> +            $({
> +                let v: $type = $val;
> +
> +                $fn(v);
> +            })*
> +        }
> +    }
> +
> +    #[test]
> +    fn atomic_basic_tests() {
> +        for_each_type!(42 in [i32, i64, u32, u64] |v| {
> +            let x = Atomic::new(v);
> +
> +            assert_eq!(v, x.load(Relaxed));
> +        });
> +    }
> +
> +    #[test]
> +    fn atomic_xchg_tests() {
> +        for_each_type!(42 in [i32, i64, u32, u64] |v| {
> +            let x = Atomic::new(v);
> +
> +            let old = v;
> +            let new = v + 1;
> +
> +            assert_eq!(old, x.xchg(new, Full));
> +            assert_eq!(new, x.load(Relaxed));
> +        });
> +    }
> +
> +    #[test]
> +    fn atomic_cmpxchg_tests() {
> +        for_each_type!(42 in [i32, i64, u32, u64] |v| {
> +            let x = Atomic::new(v);
> +
> +            let old = v;
> +            let new = v + 1;
> +
> +            assert_eq!(Err(old), x.cmpxchg(new, new, Full));
> +            assert_eq!(old, x.load(Relaxed));
> +            assert_eq!(Ok(old), x.cmpxchg(old, new, Relaxed));
> +            assert_eq!(new, x.load(Relaxed));
> +        });
> +    }
> +
> +    #[test]
> +    fn atomic_arithmetic_tests() {
> +        for_each_type!(42 in [i32, i64, u32, u64] |v| {
> +            let x = Atomic::new(v);
> +
> +            assert_eq!(v, x.fetch_add(12, Full));
> +            assert_eq!(v + 12, x.load(Relaxed));
> +
> +            x.add(13, Relaxed);
> +
> +            assert_eq!(v + 25, x.load(Relaxed));
> +        });
> +    }
> +}
> -- 
> 2.51.0
> 
> 

Reviewed-by: Elle Rhumsaa <elle@weathered-steel.dev>

  reply	other threads:[~2025-09-06  4:24 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-05  4:41 [GIT PULL] [PATCH 00/14] Rust atomic changes for v6.18 Boqun Feng
2025-09-05  4:41 ` [PATCH 01/14] rust: Introduce atomic API helpers Boqun Feng
2025-09-06  4:22   ` Elle Rhumsaa
2025-09-15  7:48   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 02/14] rust: sync: Add basic atomic operation mapping framework Boqun Feng
2025-09-06  4:22   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 03/14] rust: sync: atomic: Add ordering annotation types Boqun Feng
2025-09-06  4:22   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 04/14] rust: sync: atomic: Add generic atomics Boqun Feng
2025-09-06  4:23   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 05/14] rust: sync: atomic: Add atomic {cmp,}xchg operations Boqun Feng
2025-09-06  4:23   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 06/14] rust: sync: atomic: Add the framework of arithmetic operations Boqun Feng
2025-09-06  4:23   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 07/14] rust: sync: atomic: Add Atomic<u{32,64}> Boqun Feng
2025-09-06  4:24   ` Elle Rhumsaa [this message]
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 08/14] rust: sync: atomic: Add Atomic<{usize,isize}> Boqun Feng
2025-09-06  4:24   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 09/14] rust: sync: Add memory barriers Boqun Feng
2025-09-06  4:25   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Boqun Feng
2025-09-15  7:48   ` tip-bot2 for Boqun Feng
2025-09-05  4:41 ` [PATCH 10/14] rust: implement `kernel::sync::Refcount` Boqun Feng
2025-09-06  4:25   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Gary Guo
2025-09-15  7:48   ` tip-bot2 for Gary Guo
2025-09-05  4:41 ` [PATCH 11/14] rust: make `Arc::into_unique_or_drop` associated function Boqun Feng
2025-09-06  4:25   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Gary Guo
2025-09-15  7:48   ` tip-bot2 for Gary Guo
2025-09-05  4:41 ` [PATCH 12/14] rust: convert `Arc` to use `Refcount` Boqun Feng
2025-09-06  4:26   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Gary Guo
2025-09-15  7:48   ` tip-bot2 for Gary Guo
2025-09-05  4:41 ` [PATCH 13/14] rust: block: convert `block::mq` " Boqun Feng
2025-09-06  4:26   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Gary Guo
2025-09-15  7:48   ` tip-bot2 for Gary Guo
2025-09-05  4:41 ` [PATCH 14/14] MAINTAINERS: update atomic infrastructure entry to include Rust Boqun Feng
2025-09-06  4:26   ` Elle Rhumsaa
2025-09-13 10:15   ` [tip: locking/core] " tip-bot2 for Gary Guo
2025-09-15  7:48   ` tip-bot2 for Gary Guo
2025-09-10  5:27 ` [GIT PULL] [PATCH 00/14] Rust atomic changes for v6.18 Boqun Feng

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=aLu3aSdLwC8dInnh@archiso \
    --to=elle@weathered-steel.dev \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=gary@garyguo.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lkmm@lists.linux.dev \
    --cc=lossin@kernel.org \
    --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=stern@rowland.harvard.edu \
    --cc=tglx@linutronix.de \
    --cc=tmgross@umich.edu \
    --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.