Re: [PATCH 2/3] rust: maple_tree: Add load_rcu()
From: Alice Ryhl
Date: Wed Jul 15 2026 - 10:11:02 EST
On Fri, Jun 5, 2026 at 3:35 PM Boqun Feng <boqun@xxxxxxxxxx> wrote:
>
> From: Alice Ryhl <aliceryhl@xxxxxxxxxx>
>
> Now that we have a concept of rcu-safe containers, we may add a
> load_rcu() method to MapleTree that does not take the spinlock.
>
> Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
> ---
> rust/kernel/maple_tree.rs | 52 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 52 insertions(+)
>
> diff --git a/rust/kernel/maple_tree.rs b/rust/kernel/maple_tree.rs
> index 265d6396a78a..1499191b8935 100644
> --- a/rust/kernel/maple_tree.rs
> +++ b/rust/kernel/maple_tree.rs
> @@ -16,6 +16,10 @@
> alloc::Flags,
> error::to_result,
> prelude::*,
> + sync::rcu::{
> + self,
> + ForeignOwnableRcu, //
> + },
> types::{ForeignOwnable, Opaque},
> };
>
> @@ -233,6 +237,54 @@ pub fn erase(&self, index: usize) -> Option<T> {
> unsafe { T::try_from_foreign(ret) }
> }
>
> + /// Load the value at the given index with rcu.
> + ///
> + /// # Examples
> + ///
> + /// Read the value under an rcu read lock. Even if the value is removed, it remains accessible
> + /// for one rcu grace period.
> + ///
> + /// ```ignore
> + /// use kernel::{
> + /// maple_tree::MapleTree,
> + /// sync::rcu::{self, RcuBox},
> + /// };
> + ///
> + /// let tree = KBox::pin_init(MapleTree::<RcuBox<i32>>::new(), GFP_KERNEL)?;
> + ///
> + /// let ten = RcuBox::new(10, GFP_KERNEL)?;
> + /// tree.insert(100, ten, GFP_KERNEL)?;
> + ///
> + /// let rcu_read_lock = rcu::Guard::new();
> + /// let ten = tree.load_rcu(100, &rcu_read_lock);
> + /// assert_eq!(ten, Some(&10));
> + ///
> + /// // Even if the value gets removed, we may continue to access it for one rcu grace period.
> + /// tree.erase(100);
> + /// assert_eq!(ten, Some(&10));
> + /// # Ok::<_, Error>(())
> + /// ```
> + #[inline]
> + pub fn load_rcu<'rcu>(
> + &self,
> + index: usize,
> + _rcu: &'rcu rcu::Guard,
> + ) -> Option<T::RcuBorrowed<'rcu>>
> + where
> + T: ForeignOwnableRcu,
> + {
> + // SAFETY: `self.tree` contains a valid maple tree.
> + let ret = unsafe { bindings::mtree_load(self.tree.get(), index) };
I think this is only legal if MT_FLAGS_USE_RCU is set on the tree. :(
Alice