[PATCH v4 04/11] rust: xarray: use `xas_load` instead of `xa_load` in `Guard::load`

From: Andreas Hindborg

Date: Thu Jun 04 2026 - 16:01:57 EST


Replace the call to `xa_load` with `xas_load` in `Guard::load`. The
`xa_load` function takes the RCU lock internally, which we do not need,
since the `Guard` already holds an exclusive lock on the `XArray`. The
`xas_load` function operates on `xa_state` and assumes the required locks
are already held.

This change also removes the `#[expect(dead_code)]` annotation from
`XArrayState` and its constructor, as they are now in use.

Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx>
---
rust/kernel/xarray.rs | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/rust/kernel/xarray.rs b/rust/kernel/xarray.rs
index 6d0d4905004a..05e6dc1ffe69 100644
--- a/rust/kernel/xarray.rs
+++ b/rust/kernel/xarray.rs
@@ -216,10 +216,8 @@ fn load<F, U>(&self, index: usize, f: F) -> Option<U>
where
F: FnOnce(NonNull<c_void>) -> U,
{
- // SAFETY: `self.xa.xa` is always valid by the type invariant.
- let ptr = unsafe { bindings::xa_load(self.xa.xa.get(), index) };
- let ptr = NonNull::new(ptr.cast())?;
- Some(f(ptr))
+ let mut state = XArrayState::new(self, index);
+ Some(f(state.load()?))
}

/// Provides a reference to the element at the given index.
@@ -333,14 +331,12 @@ fn xa_ptr(&self) -> *mut bindings::xarray {
///
/// - `state` is always a valid `bindings::xa_state`.
/// - `state.xa` aliases the xarray reachable through `guard`.
-#[expect(dead_code)]
pub(crate) struct XArrayState<R: GuardRef> {
guard: R,
state: bindings::xa_state,
}

impl<R: GuardRef> XArrayState<R> {
- #[expect(dead_code)]
fn new(guard: R, index: usize) -> Self {
let xa_ptr = guard.xa_ptr();
// INVARIANT: `state` is initialized to a valid `xa_state` whose `xa` field aliases the
@@ -361,6 +357,14 @@ fn new(guard: R, index: usize) -> Self {
},
}
}
+
+ fn load(&mut self) -> Option<NonNull<c_void>> {
+ // SAFETY: `self.state` is a valid `xa_state` by the type invariant. By the same
+ // invariant, `self.state.xa` aliases the xarray reachable through `self.guard`, whose
+ // lock we hold.
+ let ptr = unsafe { bindings::xas_load(&raw mut self.state) };
+ NonNull::new(ptr.cast())
+ }
}

// SAFETY: `XArray<T>` has no shared mutable state so it is `Send` iff `T` is `Send`.

--
2.51.2