diff options
| author | FUJITA Tomonori <fujita.tomonori@gmail.com> | 2026-03-03 12:16:56 -0800 |
|---|---|---|
| committer | Peter Zijlstra <peterz@infradead.org> | 2026-03-08 11:06:49 +0100 |
| commit | ec6fc66ac39b1a6c0b06a828eff8d21928e56b60 (patch) | |
| tree | 4d689768bb7c6516985c8ecd8720cd6013b854d9 /rust/kernel/sync/atomic | |
| parent | ac8f06ade38a49f7725cc219fc6e90d1d4708d2b (diff) | |
| download | linux-ec6fc66ac39b1a6c0b06a828eff8d21928e56b60.tar.gz linux-ec6fc66ac39b1a6c0b06a828eff8d21928e56b60.zip | |
rust: sync: atomic: Add performance-optimal Flag type for atomic booleans
Add AtomicFlag type for boolean flags.
Document when AtomicFlag 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>
Signed-off-by: Boqun Feng <boqun@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Gary Guo <gary@garyguo.net>
Link: https://patch.msgid.link/20260129122622.3896144-2-tomo@aliasing.net
Link: https://patch.msgid.link/20260303201701.12204-9-boqun@kernel.org
Diffstat (limited to 'rust/kernel/sync/atomic')
| -rw-r--r-- | rust/kernel/sync/atomic/predefine.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/rust/kernel/sync/atomic/predefine.rs b/rust/kernel/sync/atomic/predefine.rs index 6f2c60529b64..ceb3caed9784 100644 --- a/rust/kernel/sync/atomic/predefine.rs +++ b/rust/kernel/sync/atomic/predefine.rs @@ -272,4 +272,21 @@ mod tests { ); assert_eq!(x.load(Relaxed), &raw const u); } + + #[test] + fn atomic_flag_tests() { + let mut flag = AtomicFlag::new(false); + + assert_eq!(false, flag.load(Relaxed)); + + *flag.get_mut() = true; + assert_eq!(true, flag.load(Relaxed)); + + assert_eq!(true, flag.xchg(false, Relaxed)); + assert_eq!(false, flag.load(Relaxed)); + + *flag.get_mut() = true; + assert_eq!(Ok(true), flag.cmpxchg(true, false, Full)); + assert_eq!(false, flag.load(Relaxed)); + } } |
