* [PATCH v3 0/2] rust: sync: atomic flag helpers
@ 2026-01-11 5:05 FUJITA Tomonori
2026-01-11 5:05 ` [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans FUJITA Tomonori
2026-01-11 5:05 ` [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use FUJITA Tomonori
0 siblings, 2 replies; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-11 5:05 UTC (permalink / raw)
To: boqun.feng, ojeda, peterz, will
Cc: a.hindborg, aliceryhl, bjorn3_gh, dakr, gary, lossin,
mark.rutland, tmgross, rust-for-linux
This series improves the Rust atomic-boolean support.
The first patch adds a Flag enum (Clear/Set) and implements AtomicType
for it, so Atomic<Flag> can be used when RMW operations (xchg/cmpxchg)
are needed and byte-sized RMWs may be inefficient.
The second patch adds AtomicFlag as a thin wrapper around Atomic<Flag>
to provide a simple bool-based load/store/xchg API.
v3:
- Add AtomicFlag struct provding a simple bool API
v2: https://lore.kernel.org/rust-for-linux/20260108125005.2945800-1-fujita.tomonori@gmail.com/
- Update the description
- Add bidirectional From conversions between Flag and bool
- Use intra-doc links
- Fix level header for Examples
- Fix a typo
- Add a newline after the `use`s block in examples
v1: https://lore.kernel.org/rust-for-linux/20260101102718.2073674-1-fujita.tomonori@gmail.com/
FUJITA Tomonori (2):
rust: sync: atomic: Add i32-backed Flag for atomic booleans
rust: sync: atomic: Add AtomicFlag bool wrapper for easier use
rust/kernel/sync/atomic.rs | 102 +++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
base-commit: 7bd94324bf04ca1161d94fc193adf782b0cfc0a9
--
2.43.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans
2026-01-11 5:05 [PATCH v3 0/2] rust: sync: atomic flag helpers FUJITA Tomonori
@ 2026-01-11 5:05 ` FUJITA Tomonori
2026-01-12 9:18 ` Alice Ryhl
2026-01-11 5:05 ` [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use FUJITA Tomonori
1 sibling, 1 reply; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-11 5:05 UTC (permalink / raw)
To: boqun.feng, ojeda, peterz, will
Cc: a.hindborg, aliceryhl, bjorn3_gh, dakr, gary, lossin,
mark.rutland, tmgross, rust-for-linux
Add a new Flag enum (Clear/Set) and implement AtomicType for it, so
users can use Atomic<Flag> for boolean flags.
The backing integer type is an implementation detail; it is currently
i32 but may change in the future.
Document when Atomic<Flag> is generally preferable to Atomic<bool>: in
particular, when RMW operations such as xchg()/cmpxchg() may be used
and minimizing memory usage is not the top priority. On some
architectures without byte-sized RMW instructions, Atomic<bool> can be
slower for RMW operations.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
---
rust/kernel/sync/atomic.rs | 56 ++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
index ca9cab77abf0..473d3c07e234 100644
--- a/rust/kernel/sync/atomic.rs
+++ b/rust/kernel/sync/atomic.rs
@@ -566,3 +566,59 @@ pub fn fetch_add<Rhs, Ordering: ordering::Ordering>(&self, v: Rhs, _: Ordering)
unsafe { from_repr(ret) }
}
}
+
+/// An atomic flag type intended to be backed by a performance-optimal integer type.
+///
+/// The backing integer type is an implementation detail; it is currently [`i32`] but may change
+/// in the future.
+///
+/// [`Atomic<Flag>`] is generally preferable to [`Atomic<bool>`] when you need read-modify-write
+/// (RMW) operations (e.g. [`Atomic::xchg()`]/[`Atomic::cmpxchg()`]) or when [`Atomic<bool>`] does
+/// not save memory due to padding. On some architectures that do not support byte-sized atomic
+/// RMW operations, RMW operations on [`Atomic<bool>`] are slower.
+///
+/// If you only use [`Atomic::load()`]/[`Atomic::store()`], either [`Atomic<bool>`] or
+/// [`Atomic<Flag>`] is fine.
+///
+/// # Examples
+///
+/// ```
+/// use kernel::sync::atomic::{Atomic, Flag, Relaxed};
+///
+/// let flag = Atomic::new(Flag::Clear);
+/// assert_eq!(Flag::Clear, flag.load(Relaxed));
+/// flag.store(Flag::Set, Relaxed);
+/// assert_eq!(Flag::Set, flag.load(Relaxed));
+/// ```
+#[derive(Clone, Copy, PartialEq, Eq)]
+#[repr(i32)]
+pub enum Flag {
+ /// The flag is clear.
+ Clear = 0,
+ /// The flag is set.
+ Set = 1,
+}
+
+// SAFETY: `Flag` and `i32` have the same size and alignment, and it is round-trip
+// transmutable to `i32`.
+unsafe impl AtomicType for Flag {
+ type Repr = i32;
+}
+
+impl From<Flag> for bool {
+ #[inline(always)]
+ fn from(f: Flag) -> Self {
+ f == Flag::Set
+ }
+}
+
+impl From<bool> for Flag {
+ #[inline(always)]
+ fn from(b: bool) -> Self {
+ if b {
+ Flag::Set
+ } else {
+ Flag::Clear
+ }
+ }
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use
2026-01-11 5:05 [PATCH v3 0/2] rust: sync: atomic flag helpers FUJITA Tomonori
2026-01-11 5:05 ` [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans FUJITA Tomonori
@ 2026-01-11 5:05 ` FUJITA Tomonori
2026-01-12 12:51 ` Gary Guo
1 sibling, 1 reply; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-11 5:05 UTC (permalink / raw)
To: boqun.feng, ojeda, peterz, will
Cc: a.hindborg, aliceryhl, bjorn3_gh, dakr, gary, lossin,
mark.rutland, tmgross, rust-for-linux
Provide AtomicFlag as a thin wrapper around Atomic<Flag> so users can
work with a simple bool API for load/store/xchg while keeping ordering
controls.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
---
rust/kernel/sync/atomic.rs | 46 ++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
index 473d3c07e234..c3039289b989 100644
--- a/rust/kernel/sync/atomic.rs
+++ b/rust/kernel/sync/atomic.rs
@@ -622,3 +622,49 @@ fn from(b: bool) -> Self {
}
}
}
+
+/// A convenience wrapper around [`Atomic<Flag>`] that exposes a [`bool`] API.
+pub struct AtomicFlag(Atomic<Flag>);
+
+impl AtomicFlag {
+ /// Creates a new atomic flag.
+ pub const fn new(b: bool) -> Self {
+ if b {
+ AtomicFlag(Atomic::new(Flag::Set))
+ } else {
+ AtomicFlag(Atomic::new(Flag::Clear))
+ }
+ }
+
+ /// Loads the value from the atomic flag.
+ #[inline(always)]
+ pub fn load<Ordering: ordering::AcquireOrRelaxed>(&self, o: Ordering) -> bool {
+ self.0.load(o).into()
+ }
+
+ /// Stores a value to the atomic flag.
+ #[inline(always)]
+ pub fn store<Ordering: ordering::ReleaseOrRelaxed>(&self, b: bool, o: Ordering) {
+ self.0.store(b.into(), o)
+ }
+
+ /// Stores a value to the atomic flag and returns the previous value.
+ #[inline(always)]
+ pub fn xchg<Ordering: ordering::Ordering>(&self, b: bool, o: Ordering) -> bool {
+ self.0.xchg(b.into(), o).into()
+ }
+
+ /// Store a value to the atomic flag if the current value is equal to `old`.
+ #[inline(always)]
+ pub fn cmpxchg<Ordering: ordering::Ordering>(
+ &self,
+ old: bool,
+ new: bool,
+ o: Ordering,
+ ) -> Result<bool, bool> {
+ match self.0.cmpxchg(old.into(), new.into(), o) {
+ Ok(v) => Ok(v.into()),
+ Err(v) => Err(v.into()),
+ }
+ }
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans
2026-01-11 5:05 ` [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans FUJITA Tomonori
@ 2026-01-12 9:18 ` Alice Ryhl
2026-01-12 22:30 ` FUJITA Tomonori
0 siblings, 1 reply; 9+ messages in thread
From: Alice Ryhl @ 2026-01-12 9:18 UTC (permalink / raw)
To: FUJITA Tomonori
Cc: boqun.feng, ojeda, peterz, will, a.hindborg, bjorn3_gh, dakr,
gary, lossin, mark.rutland, tmgross, rust-for-linux
On Sun, Jan 11, 2026 at 02:05:57PM +0900, FUJITA Tomonori wrote:
> Add a new Flag enum (Clear/Set) and implement AtomicType for it, so
> users can use Atomic<Flag> for boolean flags.
>
> The backing integer type is an implementation detail; it is currently
> i32 but may change in the future.
>
> Document when Atomic<Flag> is generally preferable to Atomic<bool>: in
> particular, when RMW operations such as xchg()/cmpxchg() may be used
> and minimizing memory usage is not the top priority. On some
> architectures without byte-sized RMW instructions, Atomic<bool> can be
> slower for RMW operations.
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
> ---
> rust/kernel/sync/atomic.rs | 56 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
> index ca9cab77abf0..473d3c07e234 100644
> --- a/rust/kernel/sync/atomic.rs
> +++ b/rust/kernel/sync/atomic.rs
> @@ -566,3 +566,59 @@ pub fn fetch_add<Rhs, Ordering: ordering::Ordering>(&self, v: Rhs, _: Ordering)
> unsafe { from_repr(ret) }
> }
> }
> +
> +/// An atomic flag type intended to be backed by a performance-optimal integer type.
> +///
> +/// The backing integer type is an implementation detail; it is currently [`i32`] but may change
> +/// in the future.
How is it, could we make it u8 on some architectures without penalty,
and have it be i32 on others? Or is i32 better always.
Alice
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use
2026-01-11 5:05 ` [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use FUJITA Tomonori
@ 2026-01-12 12:51 ` Gary Guo
2026-01-12 22:40 ` FUJITA Tomonori
0 siblings, 1 reply; 9+ messages in thread
From: Gary Guo @ 2026-01-12 12:51 UTC (permalink / raw)
To: FUJITA Tomonori, boqun.feng, ojeda, peterz, will
Cc: a.hindborg, aliceryhl, bjorn3_gh, dakr, gary, lossin,
mark.rutland, tmgross, rust-for-linux
On Sun Jan 11, 2026 at 5:05 AM GMT, FUJITA Tomonori wrote:
> Provide AtomicFlag as a thin wrapper around Atomic<Flag> so users can
> work with a simple bool API for load/store/xchg while keeping ordering
> controls.
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
> ---
> rust/kernel/sync/atomic.rs | 46 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
> index 473d3c07e234..c3039289b989 100644
> --- a/rust/kernel/sync/atomic.rs
> +++ b/rust/kernel/sync/atomic.rs
> @@ -622,3 +622,49 @@ fn from(b: bool) -> Self {
> }
> }
> }
> +
> +/// A convenience wrapper around [`Atomic<Flag>`] that exposes a [`bool`] API.
> +pub struct AtomicFlag(Atomic<Flag>);
> +
> +impl AtomicFlag {
> + /// Creates a new atomic flag.
Need an `#[inline]` here.
> + pub const fn new(b: bool) -> Self {
> + if b {
> + AtomicFlag(Atomic::new(Flag::Set))
> + } else {
> + AtomicFlag(Atomic::new(Flag::Clear))
> + }
> + }
Would it make sense to have an inherent method on `Flag`?
impl Flag {
#[inline]
pub const fn new(b: bool) -> Self { .. }
}
Best,
Gary
> +
> + /// Loads the value from the atomic flag.
> + #[inline(always)]
> + pub fn load<Ordering: ordering::AcquireOrRelaxed>(&self, o: Ordering) -> bool {
> + self.0.load(o).into()
> + }
> +
> + /// Stores a value to the atomic flag.
> + #[inline(always)]
> + pub fn store<Ordering: ordering::ReleaseOrRelaxed>(&self, b: bool, o: Ordering) {
> + self.0.store(b.into(), o)
> + }
> +
> + /// Stores a value to the atomic flag and returns the previous value.
> + #[inline(always)]
> + pub fn xchg<Ordering: ordering::Ordering>(&self, b: bool, o: Ordering) -> bool {
> + self.0.xchg(b.into(), o).into()
> + }
> +
> + /// Store a value to the atomic flag if the current value is equal to `old`.
> + #[inline(always)]
> + pub fn cmpxchg<Ordering: ordering::Ordering>(
> + &self,
> + old: bool,
> + new: bool,
> + o: Ordering,
> + ) -> Result<bool, bool> {
> + match self.0.cmpxchg(old.into(), new.into(), o) {
> + Ok(v) => Ok(v.into()),
> + Err(v) => Err(v.into()),
> + }
> + }
> +}
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans
2026-01-12 9:18 ` Alice Ryhl
@ 2026-01-12 22:30 ` FUJITA Tomonori
2026-01-13 1:12 ` Gary Guo
0 siblings, 1 reply; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-12 22:30 UTC (permalink / raw)
To: aliceryhl
Cc: fujita.tomonori, boqun.feng, ojeda, peterz, will, a.hindborg,
bjorn3_gh, dakr, gary, lossin, mark.rutland, tmgross,
rust-for-linux
On Mon, 12 Jan 2026 09:18:32 +0000
Alice Ryhl <aliceryhl@google.com> wrote:
> On Sun, Jan 11, 2026 at 02:05:57PM +0900, FUJITA Tomonori wrote:
>> Add a new Flag enum (Clear/Set) and implement AtomicType for it, so
>> users can use Atomic<Flag> for boolean flags.
>>
>> The backing integer type is an implementation detail; it is currently
>> i32 but may change in the future.
>>
>> Document when Atomic<Flag> is generally preferable to Atomic<bool>: in
>> particular, when RMW operations such as xchg()/cmpxchg() may be used
>> and minimizing memory usage is not the top priority. On some
>> architectures without byte-sized RMW instructions, Atomic<bool> can be
>> slower for RMW operations.
>>
>> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
>> ---
>> rust/kernel/sync/atomic.rs | 56 ++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 56 insertions(+)
>>
>> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
>> index ca9cab77abf0..473d3c07e234 100644
>> --- a/rust/kernel/sync/atomic.rs
>> +++ b/rust/kernel/sync/atomic.rs
>> @@ -566,3 +566,59 @@ pub fn fetch_add<Rhs, Ordering: ordering::Ordering>(&self, v: Rhs, _: Ordering)
>> unsafe { from_repr(ret) }
>> }
>> }
>> +
>> +/// An atomic flag type intended to be backed by a performance-optimal integer type.
>> +///
>> +/// The backing integer type is an implementation detail; it is currently [`i32`] but may change
>> +/// in the future.
>
> How is it, could we make it u8 on some architectures without penalty,
> and have it be i32 on others? Or is i32 better always.
Does the following look reasonable?
#[derive(Clone, Copy, PartialEq, Eq)]
#[cfg_attr(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64), repr(i8))]
#[cfg_attr(
not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)),
repr(i32)
)]
pub enum Flag {
/// The flag is clear.
Clear = 0,
/// The flag is set.
Set = 1,
}
#[cfg(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64))]
type FlagRepr = i8;
#[cfg(not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)))]
type FlagRepr = i32;
unsafe impl AtomicType for Flag {
type Repr = FlagRepr;
}
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use
2026-01-12 12:51 ` Gary Guo
@ 2026-01-12 22:40 ` FUJITA Tomonori
0 siblings, 0 replies; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-12 22:40 UTC (permalink / raw)
To: gary
Cc: fujita.tomonori, boqun.feng, ojeda, peterz, will, a.hindborg,
aliceryhl, bjorn3_gh, dakr, lossin, mark.rutland, tmgross,
rust-for-linux
On Mon, 12 Jan 2026 12:51:53 +0000
"Gary Guo" <gary@garyguo.net> wrote:
> On Sun Jan 11, 2026 at 5:05 AM GMT, FUJITA Tomonori wrote:
>> Provide AtomicFlag as a thin wrapper around Atomic<Flag> so users can
>> work with a simple bool API for load/store/xchg while keeping ordering
>> controls.
>>
>> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
>> ---
>> rust/kernel/sync/atomic.rs | 46 ++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 46 insertions(+)
>>
>> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
>> index 473d3c07e234..c3039289b989 100644
>> --- a/rust/kernel/sync/atomic.rs
>> +++ b/rust/kernel/sync/atomic.rs
>> @@ -622,3 +622,49 @@ fn from(b: bool) -> Self {
>> }
>> }
>> }
>> +
>> +/// A convenience wrapper around [`Atomic<Flag>`] that exposes a [`bool`] API.
>> +pub struct AtomicFlag(Atomic<Flag>);
>> +
>> +impl AtomicFlag {
>> + /// Creates a new atomic flag.
>
> Need an `#[inline]` here.
Thanks, good catch. I'll add in v4.
>> + pub const fn new(b: bool) -> Self {
>> + if b {
>> + AtomicFlag(Atomic::new(Flag::Set))
>> + } else {
>> + AtomicFlag(Atomic::new(Flag::Clear))
>> + }
>> + }
>
> Would it make sense to have an inherent method on `Flag`?
>
> impl Flag {
> #[inline]
> pub const fn new(b: bool) -> Self { .. }
> }
Yes, that makes sense. I'll change it.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans
2026-01-12 22:30 ` FUJITA Tomonori
@ 2026-01-13 1:12 ` Gary Guo
2026-01-13 1:45 ` FUJITA Tomonori
0 siblings, 1 reply; 9+ messages in thread
From: Gary Guo @ 2026-01-13 1:12 UTC (permalink / raw)
To: FUJITA Tomonori, aliceryhl
Cc: boqun.feng, ojeda, peterz, will, a.hindborg, bjorn3_gh, dakr,
gary, lossin, mark.rutland, tmgross, rust-for-linux
On Mon Jan 12, 2026 at 10:30 PM GMT, FUJITA Tomonori wrote:
> On Mon, 12 Jan 2026 09:18:32 +0000
> Alice Ryhl <aliceryhl@google.com> wrote:
>
>> On Sun, Jan 11, 2026 at 02:05:57PM +0900, FUJITA Tomonori wrote:
>>> Add a new Flag enum (Clear/Set) and implement AtomicType for it, so
>>> users can use Atomic<Flag> for boolean flags.
>>>
>>> The backing integer type is an implementation detail; it is currently
>>> i32 but may change in the future.
>>>
>>> Document when Atomic<Flag> is generally preferable to Atomic<bool>: in
>>> particular, when RMW operations such as xchg()/cmpxchg() may be used
>>> and minimizing memory usage is not the top priority. On some
>>> architectures without byte-sized RMW instructions, Atomic<bool> can be
>>> slower for RMW operations.
>>>
>>> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
>>> ---
>>> rust/kernel/sync/atomic.rs | 56 ++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 56 insertions(+)
>>>
>>> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
>>> index ca9cab77abf0..473d3c07e234 100644
>>> --- a/rust/kernel/sync/atomic.rs
>>> +++ b/rust/kernel/sync/atomic.rs
>>> @@ -566,3 +566,59 @@ pub fn fetch_add<Rhs, Ordering: ordering::Ordering>(&self, v: Rhs, _: Ordering)
>>> unsafe { from_repr(ret) }
>>> }
>>> }
>>> +
>>> +/// An atomic flag type intended to be backed by a performance-optimal integer type.
>>> +///
>>> +/// The backing integer type is an implementation detail; it is currently [`i32`] but may change
>>> +/// in the future.
>>
>> How is it, could we make it u8 on some architectures without penalty,
>> and have it be i32 on others? Or is i32 better always.
>
> Does the following look reasonable?
>
> #[derive(Clone, Copy, PartialEq, Eq)]
> #[cfg_attr(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64), repr(i8))]
> #[cfg_attr(
> not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)),
> repr(i32)
> )]
The arch list looks correct to me.
> pub enum Flag {
> /// The flag is clear.
> Clear = 0,
> /// The flag is set.
> Set = 1,
> }
>
> #[cfg(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64))]
> type FlagRepr = i8;
> #[cfg(not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)))]
> type FlagRepr = i32;
This doesn't need an extra typedef. You can just put `#[cfg]` on the associate
item below.
Best,
Gary
>
> unsafe impl AtomicType for Flag {
> type Repr = FlagRepr;
> }
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans
2026-01-13 1:12 ` Gary Guo
@ 2026-01-13 1:45 ` FUJITA Tomonori
0 siblings, 0 replies; 9+ messages in thread
From: FUJITA Tomonori @ 2026-01-13 1:45 UTC (permalink / raw)
To: gary
Cc: fujita.tomonori, aliceryhl, boqun.feng, ojeda, peterz, will,
a.hindborg, bjorn3_gh, dakr, lossin, mark.rutland, tmgross,
rust-for-linux
On Tue, 13 Jan 2026 01:12:29 +0000
"Gary Guo" <gary@garyguo.net> wrote:
> On Mon Jan 12, 2026 at 10:30 PM GMT, FUJITA Tomonori wrote:
>> On Mon, 12 Jan 2026 09:18:32 +0000
>> Alice Ryhl <aliceryhl@google.com> wrote:
>>
>>> On Sun, Jan 11, 2026 at 02:05:57PM +0900, FUJITA Tomonori wrote:
>>>> Add a new Flag enum (Clear/Set) and implement AtomicType for it, so
>>>> users can use Atomic<Flag> for boolean flags.
>>>>
>>>> The backing integer type is an implementation detail; it is currently
>>>> i32 but may change in the future.
>>>>
>>>> Document when Atomic<Flag> is generally preferable to Atomic<bool>: in
>>>> particular, when RMW operations such as xchg()/cmpxchg() may be used
>>>> and minimizing memory usage is not the top priority. On some
>>>> architectures without byte-sized RMW instructions, Atomic<bool> can be
>>>> slower for RMW operations.
>>>>
>>>> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
>>>> ---
>>>> rust/kernel/sync/atomic.rs | 56 ++++++++++++++++++++++++++++++++++++++
>>>> 1 file changed, 56 insertions(+)
>>>>
>>>> diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs
>>>> index ca9cab77abf0..473d3c07e234 100644
>>>> --- a/rust/kernel/sync/atomic.rs
>>>> +++ b/rust/kernel/sync/atomic.rs
>>>> @@ -566,3 +566,59 @@ pub fn fetch_add<Rhs, Ordering: ordering::Ordering>(&self, v: Rhs, _: Ordering)
>>>> unsafe { from_repr(ret) }
>>>> }
>>>> }
>>>> +
>>>> +/// An atomic flag type intended to be backed by a performance-optimal integer type.
>>>> +///
>>>> +/// The backing integer type is an implementation detail; it is currently [`i32`] but may change
>>>> +/// in the future.
>>>
>>> How is it, could we make it u8 on some architectures without penalty,
>>> and have it be i32 on others? Or is i32 better always.
>>
>> Does the following look reasonable?
>>
>> #[derive(Clone, Copy, PartialEq, Eq)]
>> #[cfg_attr(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64), repr(i8))]
>> #[cfg_attr(
>> not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)),
>> repr(i32)
>> )]
>
> The arch list looks correct to me.
Thanks for confirming.
>> pub enum Flag {
>> /// The flag is clear.
>> Clear = 0,
>> /// The flag is set.
>> Set = 1,
>> }
>>
>> #[cfg(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64))]
>> type FlagRepr = i8;
>> #[cfg(not(any(CONFIG_X86_64, CONFIG_UML, CONFIG_ARM, CONFIG_ARM64)))]
>> type FlagRepr = i32;
>
> This doesn't need an extra typedef. You can just put `#[cfg]` on the associate
> item below.
Got it. I thought the type alias was cleaner, but I'll drop it and put
the #[cfg] on the associated type.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-01-13 1:45 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-11 5:05 [PATCH v3 0/2] rust: sync: atomic flag helpers FUJITA Tomonori
2026-01-11 5:05 ` [PATCH v3 1/2] rust: sync: atomic: Add i32-backed Flag for atomic booleans FUJITA Tomonori
2026-01-12 9:18 ` Alice Ryhl
2026-01-12 22:30 ` FUJITA Tomonori
2026-01-13 1:12 ` Gary Guo
2026-01-13 1:45 ` FUJITA Tomonori
2026-01-11 5:05 ` [PATCH v3 2/2] rust: sync: atomic: Add AtomicFlag bool wrapper for easier use FUJITA Tomonori
2026-01-12 12:51 ` Gary Guo
2026-01-12 22:40 ` FUJITA Tomonori
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox