On Fri, Jun 5, 2026 at 3:35 PM Boqun Feng <[email protected]> wrote: > > From: Alice Ryhl <[email protected]> > > 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 <[email protected]> > --- > 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

