Re: [PATCH 1/3] rust: implement `kernel::sync::Refcount`

From: Dirk Behme
Date: Fri Oct 04 2024 - 12:35:04 EST


Am 04.10.24 um 17:52 schrieb Gary Guo:
This is a wrapping layer of `include/linux/refcount.h`. Currently only
the most basic operations (read/set/inc/dec/dec_and_test) are implemented,
additional methods can be implemented when they are needed.

Currently the kernel refcount has already been used in `Arc`, however it
calls into FFI directly.

Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Boqun Feng <boqun.feng@xxxxxxxxx>
Cc: Mark Rutland <mark.rutland@xxxxxxx>
Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
---
rust/helpers/refcount.c | 15 ++++++
...
diff --git a/rust/kernel/sync.rs b/rust/kernel/sync.rs
index 0ab20975a3b5..534f098a44eb 100644
--- a/rust/kernel/sync.rs
+++ b/rust/kernel/sync.rs
@@ -11,12 +11,14 @@
mod condvar;
pub mod lock;
mod locked_by;
+mod refcount;
pub use arc::{Arc, ArcBorrow, UniqueArc};
pub use condvar::{new_condvar, CondVar, CondVarTimeoutResult};
pub use lock::mutex::{new_mutex, Mutex};
pub use lock::spinlock::{new_spinlock, SpinLock};
pub use locked_by::LockedBy;
+pub use refcount::Refcount;
/// Represents a lockdep class. It's a wrapper around C's `lock_class_key`.
#[repr(transparent)]
diff --git a/rust/kernel/sync/refcount.rs b/rust/kernel/sync/refcount.rs
new file mode 100644
index 000000000000..4a5b815adc05
--- /dev/null
+++ b/rust/kernel/sync/refcount.rs
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0
+
+//! Atomic reference counting.
+//!
+//! C header: [`include/linux/refcount.h`](srctree/include/linux/refcount.h)
+
+use crate::types::Opaque;
+use core::sync::atomic::AtomicI32;
+
+/// Atomic reference counter.
+///
+/// This type is conceptually an atomic integer, but provides a saturation semantics compared to

"a ... samantics": Do you like to check that? Either "a ... semantic" (without 's')? Or if it shall be plural drop the 'a'?

...
+ /// Increment a refcount.
+ ///
+ /// It will saturate if overflows and `WARN`. It will also `WARN` is the refcount is 0, as this

WARN if ? Not "is" ?

Best regards

Dirk