All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Danilo Krummrich" <dakr@kernel.org>, <akpm@linux-foundation.org>,
	<ojeda@kernel.org>, <alex.gaynor@gmail.com>,
	<boqun.feng@gmail.com>, <gary@garyguo.net>,
	<bjorn3_gh@protonmail.com>, <lossin@kernel.org>,
	<a.hindborg@kernel.org>, <aliceryhl@google.com>,
	<tmgross@umich.edu>, <abdiel.janulgue@gmail.com>, <jgg@ziepe.ca>,
	<lyude@redhat.com>, <robin.murphy@arm.com>,
	<daniel.almeida@collabora.com>
Cc: <rust-for-linux@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 3/5] rust: scatterlist: Add abstraction for sg_table
Date: Tue, 26 Aug 2025 23:36:44 +0900	[thread overview]
Message-ID: <DCCFOGR3BPVC.3OW6B74N372MB@nvidia.com> (raw)
In-Reply-To: <20250825132539.122412-4-dakr@kernel.org>

On Mon Aug 25, 2025 at 10:24 PM JST, Danilo Krummrich wrote:
> Add a safe Rust abstraction for the kernel's scatter-gather list
> facilities (`struct scatterlist` and `struct sg_table`).
>
> This commit introduces `SGTable<T>`, a wrapper that uses a generic
> parameter to provide compile-time guarantees about ownership and lifetime.
>
> The abstraction provides two primary states:
> - `SGTable<Owned<P>>`: Represents a table whose resources are fully
>   managed by Rust. It takes ownership of a page provider `P`, allocates
>   the underlying `struct sg_table`, maps it for DMA, and handles all
>   cleanup automatically upon drop. The DMA mapping's lifetime is tied to
>   the associated device using `Devres`, ensuring it is correctly unmapped
>   before the device is unbound.
> - `SGTable<Borrowed>` (or just `SGTable`): A zero-cost representation of
>   an externally managed `struct sg_table`. It is created from a raw
>   pointer using `SGTable::as_ref()` and provides a lifetime-bound
>   reference (`&'a SGTable`) for operations like iteration.
>
> The API exposes a safe iterator that yields `&SGEntry` references,
> allowing drivers to easily access the DMA address and length of each
> segment in the list.
>
> Co-developed-by: Abdiel Janulgue <abdiel.janulgue@gmail.com>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@gmail.com>
> Signed-off-by: Danilo Krummrich <dakr@kernel.org>

A few minor things below, but:

Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>

Used successfully on nova-core:

Tested-by: Alexandre Courbot <acourbot@nvidia.com>

I still see mentions of "type state" in the code (and the commit
message), is this on purpose? I still think this is a misleading use of
the term, but your call.

<snip>
> +impl SGEntry {
> +    /// Convert a raw `struct scatterlist *` to a `&'a SGEntry`.
> +    ///
> +    /// # Safety
> +    ///
> +    /// Callers must ensure that the `struct scatterlist` pointed to by `ptr` is valid for the
> +    /// lifetime `'a`.

Shouldn't the scatterlist also have valid a dma_address and dma_len?

<snip>
> +#[repr(transparent)]
> +#[pin_data(PinnedDrop)]
> +struct RawSGTable {

Even if this is for internal use, I think a short comment explaining
what this is for, and why it needs to be pinned (pointed to by devres)
would be helpful to people looking at this code.


  parent reply	other threads:[~2025-08-26 14:36 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-25 13:24 [PATCH v3 0/5] Rust infrastructure for sg_table and scatterlist Danilo Krummrich
2025-08-25 13:24 ` [PATCH v3 1/5] rust: dma: implement DataDirection Danilo Krummrich
2025-08-26 17:10   ` Daniel Almeida
2025-08-25 13:24 ` [PATCH v3 2/5] rust: dma: add type alias for bindings::dma_addr_t Danilo Krummrich
2025-08-26 17:15   ` Daniel Almeida
2025-08-26 17:33     ` Danilo Krummrich
2025-08-26 19:58       ` Daniel Almeida
2025-08-25 13:24 ` [PATCH v3 3/5] rust: scatterlist: Add abstraction for sg_table Danilo Krummrich
2025-08-26 14:16   ` Alice Ryhl
2025-08-26 14:32     ` Danilo Krummrich
2025-08-26 17:41       ` Daniel Almeida
2025-08-26 14:36   ` Alexandre Courbot [this message]
2025-08-26 15:18     ` Danilo Krummrich
2025-08-26 17:45       ` Daniel Almeida
2025-08-26 23:38       ` Danilo Krummrich
2025-08-27  8:30       ` Alexandre Courbot
2025-08-26 17:40   ` Daniel Almeida
2025-08-26 19:13     ` Danilo Krummrich
2025-08-26 20:16       ` Daniel Almeida
2025-08-26 20:27         ` Danilo Krummrich
2025-08-25 13:24 ` [PATCH v3 4/5] samples: rust: dma: add sample code for SGTable Danilo Krummrich
2025-08-26 14:38   ` Alexandre Courbot
2025-08-26 17:46   ` Daniel Almeida
2025-08-25 13:24 ` [PATCH v3 5/5] MAINTAINERS: rust: dma: add scatterlist files Danilo Krummrich
2025-08-28 10:19   ` Miguel Ojeda
2025-08-26 21:01 ` [PATCH v3 0/5] Rust infrastructure for sg_table and scatterlist Lyude Paul

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=DCCFOGR3BPVC.3OW6B74N372MB@nvidia.com \
    --to=acourbot@nvidia.com \
    --cc=a.hindborg@kernel.org \
    --cc=abdiel.janulgue@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=gary@garyguo.net \
    --cc=jgg@ziepe.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=lyude@redhat.com \
    --cc=ojeda@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tmgross@umich.edu \
    /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.