All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Hindborg <a.hindborg@kernel.org>
To: Tamir Duberstein <tamird@kernel.org>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Christoph Lameter" <cl@gentwo.org>,
	"David Rientjes" <rientjes@google.com>,
	"Roman Gushchin" <roman.gushchin@linux.dev>,
	"Tamir Duberstein" <tamird@kernel.org>,
	"Boqun Feng" <boqun@kernel.org>,
	"Lorenzo Stoakes" <ljs@kernel.org>,
	"Liam R. Howlett" <liam@infradead.org>,
	"Vlastimil Babka" <vbabka@kernel.org>,
	"Harry Yoo" <harry@kernel.org>, "Hao Li" <hao.li@linux.dev>,
	"Daniel Gomez" <da.gomez@kernel.org>,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org
Subject: Re: [PATCH v4 03/11] rust: xarray: add `XArrayState`
Date: Tue, 09 Jun 2026 10:38:13 +0200	[thread overview]
Message-ID: <87ldcoglca.fsf@kernel.org> (raw)
In-Reply-To: <178067251345.96312.12627213045914595867.b4-review@b4>

Tamir Duberstein <tamird@kernel.org> writes:

> On Thu, 04 Jun 2026 21:58:09 +0200, Andreas Hindborg <a.hindborg@kernel.org> wrote:
>> Add `XArrayState` as internal state for XArray iteration and entry
>> operations. This struct wraps the C `xa_state` structure and holds a
>> reference to a `Guard` to ensure exclusive access to the XArray for the
>> lifetime of the state object.
>> 
>> The `XAS_RESTART` constant is also exposed through the bindings helper
>> to properly initialize the `xa_node` field.
>> 
>> The struct and its constructor are marked with `#[expect(dead_code)]` as
>> there are no users yet. We will remove this annotation in a later patch.
>
> The review of this patch in v3 requested the next patch be absorbed into
> it.

I must have missed that.

>
>>
>>
>> diff --git a/rust/kernel/xarray.rs b/rust/kernel/xarray.rs
>> index d54942aeb201..6d0d4905004a 100644
>> --- a/rust/kernel/xarray.rs
>> +++ b/rust/kernel/xarray.rs
>> @@ -299,6 +302,67 @@ pub fn store(
>> [ ... skip 17 lines ... ]
>> +impl<'a, T: ForeignOwnable> GuardRef for &mut Guard<'a, T> {
>> +    type Value = T;
>> +    fn xa_ptr(&self) -> *mut bindings::xarray {
>> +        self.xa.xa.get()
>> +    }
>> +}
>
> I'm having a hard time understanding the need for this trait, and it is
> not described in the commit message at all. How is this different than
> using Deref? `&mut T` has a blanket `Deref<Target = T>` impl.

I needed `XArrayState` to be generic over `&Guard<'a, T>` and `&mut
Guard<'a, T>` with ability to obtain the raw xarray pointer through the
guard, and ability to name `T`. I did not consider just using `Deref`,
but we can do that. The bounds on the impl block become a bit more
complicated, but I guess that is fine. Here is a diff (against head of series):

diff --git a/rust/kernel/xarray.rs b/rust/kernel/xarray.rs
index cbb16368c2ca..f5a499c23778 100644
--- a/rust/kernel/xarray.rs
+++ b/rust/kernel/xarray.rs
@@ -551,27 +551,6 @@ pub fn insert_entry<'b>(
     }
 }
 
-/// A reference to a [`Guard`], either shared or mutable, that exposes the
-/// underlying xarray pointer and the value type stored in the array.
-pub(crate) trait GuardRef {
-    type Value: ForeignOwnable;
-    fn xa_ptr(&self) -> *mut bindings::xarray;
-}
-
-impl<'a, T: ForeignOwnable> GuardRef for &Guard<'a, T> {
-    type Value = T;
-    fn xa_ptr(&self) -> *mut bindings::xarray {
-        self.xa.xa.get()
-    }
-}
-
-impl<'a, T: ForeignOwnable> GuardRef for &mut Guard<'a, T> {
-    type Value = T;
-    fn xa_ptr(&self) -> *mut bindings::xarray {
-        self.xa.xa.get()
-    }
-}
-
 /// Internal state for XArray iteration and entry operations.
 ///
 /// `R` is the borrow held on the guard: either `&Guard` for read-only callers
@@ -582,12 +561,12 @@ fn xa_ptr(&self) -> *mut bindings::xarray {
 ///
 /// - `state` is always a valid `bindings::xa_state`.
 /// - `state.xa` aliases the xarray reachable through `guard`.
-pub(crate) struct XArrayState<R: GuardRef> {
+pub(crate) struct XArrayState<R> {
     guard: R,
     state: bindings::xa_state,
 }
 
-impl<R: GuardRef> Drop for XArrayState<R> {
+impl<R> Drop for XArrayState<R> {
     fn drop(&mut self) {
         free_xa_alloc(&mut self.state);
     }
@@ -611,9 +590,13 @@ fn free_xa_alloc(state: &mut bindings::xa_state) {
     }
 }
 
-impl<R: GuardRef> XArrayState<R> {
+impl<'a, R, T> XArrayState<R>
+where
+    T: ForeignOwnable + 'a,
+    R: core::ops::Deref<Target = Guard<'a, T>>
+{
     fn new(guard: R, index: usize) -> Self {
-        let xa_ptr = guard.xa_ptr();
+        let xa_ptr = guard.xa.xa.get();
         // INVARIANT: `state` is initialized to a valid `xa_state` whose `xa` field aliases the
         // xarray reachable through `guard`.
         Self {
@@ -656,10 +639,10 @@ fn status(&self) -> Result {
 
     fn insert(
         &mut self,
-        value: R::Value,
+        value: T,
         mut preload: Option<&mut XArraySheaf<'_>>,
-    ) -> Result<*mut c_void, StoreError<R::Value>> {
-        let new = R::Value::into_foreign(value).cast();
+    ) -> Result<*mut c_void, StoreError<T>> {
+        let new = T::into_foreign(value).cast();
 
         loop {
             // SAFETY: `self.state` is a valid `xa_state` by the type invariant. By the same
@@ -686,7 +669,7 @@ fn insert(
         .map_err(|error| {
             // SAFETY: `new` came from `R::Value::into_foreign` and `xas_store` does not take
             // ownership of the value on error.
-            let value = unsafe { R::Value::from_foreign(new) };
+            let value = unsafe { T::from_foreign(new) };
             StoreError { value, error }
         })
     }
---


Best regards,
Andreas Hindborg




  reply	other threads:[~2026-06-09  8:38 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-04 19:58 [PATCH v4 00/11] rust: xarray: add entry API with preloading Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 01/11] rust: xarray: minor formatting fixes Andreas Hindborg
     [not found]   ` <Yb-tTMBfsrAuBw9NXgUPl-MY1hGnE7OrQD5JOEwzYuL2Af2BZYrfDg5FzWfVfmulrnBeioLiEacxVMKrswog9g==@protonmail.internalid>
     [not found]     ` <20260604201631.450B51F00893@smtp.kernel.org>
2026-06-09 10:57       ` Andreas Hindborg
2026-06-09 12:36         ` Gary Guo
2026-06-04 19:58 ` [PATCH v4 02/11] rust: xarray: add debug format for `StoreError` Andreas Hindborg
2026-06-05 15:15   ` Tamir Duberstein
2026-06-09  8:06     ` Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 03/11] rust: xarray: add `XArrayState` Andreas Hindborg
2026-06-05 15:15   ` Tamir Duberstein
2026-06-09  8:38     ` Andreas Hindborg [this message]
2026-06-04 19:58 ` [PATCH v4 04/11] rust: xarray: use `xas_load` instead of `xa_load` in `Guard::load` Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 05/11] rust: xarray: simplify `Guard::load` Andreas Hindborg
2026-06-05 15:15   ` Tamir Duberstein
2026-06-09  8:39     ` Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 06/11] rust: xarray: add `find_next` and `find_next_mut` Andreas Hindborg
2026-06-05 15:15   ` Tamir Duberstein
2026-06-04 19:58 ` [PATCH v4 07/11] rust: xarray: add entry API Andreas Hindborg
2026-06-05 15:15   ` Tamir Duberstein
2026-06-04 19:58 ` [PATCH v4 08/11] rust: mm: add abstractions for allocating from a `sheaf` Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 09/11] rust: mm: sheaf: allow use of C initialized static caches Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 10/11] xarray, radix-tree: enable sheaf support for kmem_cache Andreas Hindborg
2026-06-04 19:58 ` [PATCH v4 11/11] rust: xarray: add preload API Andreas Hindborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ldcoglca.fsf@kernel.org \
    --to=a.hindborg@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=cl@gentwo.org \
    --cc=da.gomez@kernel.org \
    --cc=dakr@kernel.org \
    --cc=gary@garyguo.net \
    --cc=hao.li@linux.dev \
    --cc=harry@kernel.org \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=lossin@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tamird@kernel.org \
    --cc=tmgross@umich.edu \
    --cc=vbabka@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.