On Tue, 12 Aug 2025 10:17:44 +0200 "Benno Lossin" <lossin@xxxxxxxxxx> wrote: > On Thu Jul 24, 2025 at 1:32 AM CEST, Gary Guo wrote: > > From: Gary Guo <gary@xxxxxxxxxxx> > > > > Currently there's a custom reference counting in `block::mq`, which uses > > `AtomicU64` Rust atomics, and this type doesn't exist on some 32-bit > > architectures. We cannot just change it to use 32-bit atomics, because > > doing so will make it vulnerable to refcount overflow. So switch it to > > use the kernel refcount `kernel::sync::Refcount` instead. > > > > There is an operation needed by `block::mq`, atomically decreasing > > refcount from 2 to 0, which is not available through refcount.h, so > > I exposed `Refcount::as_atomic` which allows accessing the refcount > > directly. > > > > Tested-by: David Gow <davidgow@xxxxxxxxxx> > > Acked-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx> > > Signed-off-by: Gary Guo <gary@xxxxxxxxxxx> > > Reviewed-by: Benno Lossin <lossin@xxxxxxxxxx> > > > --- > > rust/kernel/block/mq/operations.rs | 7 ++-- > > rust/kernel/block/mq/request.rs | 63 ++++++++---------------------- > > rust/kernel/sync/refcount.rs | 14 +++++++ > > 3 files changed, 34 insertions(+), 50 deletions(-) > > > diff --git a/rust/kernel/sync/refcount.rs b/rust/kernel/sync/refcount.rs > > index 3ff4585326b41..a9b24c6b2f8a7 100644 > > --- a/rust/kernel/sync/refcount.rs > > +++ b/rust/kernel/sync/refcount.rs > > @@ -4,6 +4,8 @@ > > //! > > //! C header: [`include/linux/refcount.h`](srctree/include/linux/refcount.h) > > > > +use core::sync::atomic::AtomicI32; > > + > > use crate::build_assert; > > use crate::types::Opaque; > > > > @@ -34,6 +36,18 @@ fn as_ptr(&self) -> *mut bindings::refcount_t { > > self.0.get() > > } > > > > + /// Get the underlying atomic counter that backs the refcount. > > + /// > > + /// NOTE: This will be changed to LKMM atomic in the future. > > Can we discourage using this function a bit more in the docs? At least > point people to try other ways before reaching for this, since it allows > overflowing & doesn't warn on saturate etc. Would this additional doc comment be good enough for you? /// NOTE: usage of this function is discouraged unless there is no way /// to achieve the desired result using APIs in `refcount.h`. If an API /// in `refcount.h` does not currently contain a binding, please /// consider adding a binding for it instead. Best, Gary > > --- > Cheers, > Benno > > > + #[inline] > > + pub fn as_atomic(&self) -> &AtomicI32 { > > + let ptr = self.0.get().cast(); > > + // SAFETY: `refcount_t` is a transparent wrapper of `atomic_t`, which is an atomic 32-bit > > + // integer that is layout-wise compatible with `AtomicI32`. All values are valid for > > + // `refcount_t`, despite some of the values being considered saturated and "bad". > > + unsafe { &*ptr } > > + } > > + > > /// Set a refcount's value. > > #[inline] > > pub fn set(&self, value: i32) { >