From: "Danilo Krummrich" <dakr@kernel.org>
To: "Alexandre Courbot" <acourbot@nvidia.com>
Cc: <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>,
<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 17:18:42 +0200 [thread overview]
Message-ID: <DCCGKLKK0D08.1VOAVWOJIXIIO@kernel.org> (raw)
In-Reply-To: <DCCFOGR3BPVC.3OW6B74N372MB@nvidia.com>
On Tue Aug 26, 2025 at 4:36 PM CEST, Alexandre Courbot wrote:
> 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>
Thanks for re-testing!
> 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.
I think I changed everything in the commit message, but there are indeed two or
three mentions in the code still.
I'm happy to replace them with "generic parameter", but I do not agree that the
term "type state" is misleading.
It may not be the classical typestate pattern, yet we are representing two
distinct states of a type.
> <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?
I don't think this is safety relevant from the perspective of Rust.
Also note that if we want to provide this guarantee, we need the caller to
provide the &Device<Bound> in SGTable::iter() the SGTable has been created with.
For the Owned generic parameter this is easy, for the Borrowed one we have no
way to ensure that the &Device<Bound> matches the device the SGTable has been
mapped for.
However, I don't think we have to provide this guarantee, since at this point
all device resources (such as I/O memory) have been revoked from the driver
already. So, effectively, even if a driver would attempt to program invalid DMA
addresses, the driver would be uncapable of doing so anyways.
> <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)
That's not the reason this structure needs to be pinned. This is the reason for
Devres itself needs to be pinned.
In fact, I think RawSGTable by itself does not need to be pinned.
> would be helpful to people looking at this code.
next prev parent reply other threads:[~2025-08-26 15:18 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
2025-08-26 15:18 ` Danilo Krummrich [this message]
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=DCCGKLKK0D08.1VOAVWOJIXIIO@kernel.org \
--to=dakr@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=abdiel.janulgue@gmail.com \
--cc=acourbot@nvidia.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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).