From: Boqun Feng <boqun@kernel.org>
To: Gary Guo <gary@garyguo.net>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Tamir Duberstein" <tamird@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Onur Özkan" <work@onurozkan.dev>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] rust: revocable: use LKMM atomics instead of Rust atomics
Date: Sat, 25 Jul 2026 07:09:37 -0700 [thread overview]
Message-ID: <amTDoW2sark_jEUa@MacBook-0RXW5> (raw)
In-Reply-To: <20260716145536.3681630-1-gary@kernel.org>
On Thu, Jul 16, 2026 at 03:55:35PM +0100, Gary Guo wrote:
> From: Gary Guo <gary@garyguo.net>
>
> Kernel code should use LKMM atomics. The existing code is `AtomicBool` with
> the need to use `xchg`, so convert it to `AtomicFlag`.
>
> Signed-off-by: Gary Guo <gary@garyguo.net>
Queued it in rust-sync, thank you all!
Regards,
Boqun
> ---
> rust/kernel/revocable.rs | 26 ++++++++++++++++++--------
> 1 file changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/rust/kernel/revocable.rs b/rust/kernel/revocable.rs
> index 2af212ea3b6d..4d177744520a 100644
> --- a/rust/kernel/revocable.rs
> +++ b/rust/kernel/revocable.rs
> @@ -7,12 +7,22 @@
>
> use pin_init::Wrapper;
>
> -use crate::{bindings, prelude::*, sync::rcu, types::Opaque};
> +use crate::{
> + bindings,
> + prelude::*,
> + sync::{
> + atomic::{
> + AtomicFlag,
> + Relaxed, //
> + },
> + rcu, //
> + },
> + types::Opaque, //
> +};
> use core::{
> marker::PhantomData,
> ops::Deref,
> - ptr::drop_in_place,
> - sync::atomic::{AtomicBool, Ordering},
> + ptr::drop_in_place, //
> };
>
> /// An object that can become inaccessible at runtime.
> @@ -66,7 +76,7 @@
> /// ```
> #[pin_data(PinnedDrop)]
> pub struct Revocable<T> {
> - is_available: AtomicBool,
> + is_available: AtomicFlag,
> #[pin]
> data: Opaque<T>,
> }
> @@ -85,7 +95,7 @@ impl<T> Revocable<T> {
> /// Creates a new revocable instance of the given data.
> pub fn new<E>(data: impl PinInit<T, E>) -> impl PinInit<Self, E> {
> try_pin_init!(Self {
> - is_available: AtomicBool::new(true),
> + is_available: AtomicFlag::new(true),
> data <- Opaque::pin_init(data),
> }? E)
> }
> @@ -99,7 +109,7 @@ pub fn new<E>(data: impl PinInit<T, E>) -> impl PinInit<Self, E> {
> /// because another CPU may be waiting to complete the revocation of this object.
> pub fn try_access(&self) -> Option<RevocableGuard<'_, T>> {
> let guard = rcu::read_lock();
> - if self.is_available.load(Ordering::Relaxed) {
> + if self.is_available.load(Relaxed) {
> // Since `self.is_available` is true, data is initialised and has to remain valid
> // because the RCU read side lock prevents it from being dropped.
> Some(RevocableGuard::new(self.data.get(), guard))
> @@ -117,7 +127,7 @@ pub fn try_access(&self) -> Option<RevocableGuard<'_, T>> {
> /// allowed to sleep because another CPU may be waiting to complete the revocation of this
> /// object.
> pub fn try_access_with_guard<'a>(&'a self, _guard: &'a rcu::Guard) -> Option<&'a T> {
> - if self.is_available.load(Ordering::Relaxed) {
> + if self.is_available.load(Relaxed) {
> // SAFETY: Since `self.is_available` is true, data is initialised and has to remain
> // valid because the RCU read side lock prevents it from being dropped.
> Some(unsafe { &*self.data.get() })
> @@ -158,7 +168,7 @@ pub unsafe fn access(&self) -> &T {
> ///
> /// Callers must ensure that there are no more concurrent users of the revocable object.
> unsafe fn revoke_internal<const SYNC: bool>(&self) -> bool {
> - let revoke = self.is_available.swap(false, Ordering::Relaxed);
> + let revoke = self.is_available.xchg(false, Relaxed);
>
> if revoke {
> if SYNC {
>
> base-commit: b8809969e1d7a591e0f49dd464a5d04b3cf02ab1
> --
> 2.54.0
>
prev parent reply other threads:[~2026-07-25 14:09 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 14:55 [PATCH] rust: revocable: use LKMM atomics instead of Rust atomics Gary Guo
2026-07-17 5:26 ` FUJITA Tomonori
2026-07-22 18:14 ` Alice Ryhl
2026-07-25 14:09 ` Boqun Feng [this message]
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=amTDoW2sark_jEUa@MacBook-0RXW5 \
--to=boqun@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=work@onurozkan.dev \
/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.