From: Danilo Krummrich <dakr@kernel.org>
To: 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, acourbot@nvidia.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,
Danilo Krummrich <dakr@kernel.org>
Subject: [PATCH v2 0/5] Rust infrastructure for sg_table and scatterlist
Date: Wed, 20 Aug 2025 18:52:54 +0200 [thread overview]
Message-ID: <20250820165431.170195-1-dakr@kernel.org> (raw)
This patch series provides abstractions for struct sg_table and struct
scatterlist.
Abdiel and me agreed for me to take over his previous iterations on this topic.
I decided to send my patches as a new series rather than as a subsequent version
of Abdiel's previous iterations, since the changes I made turned out to be much
closer to a full rewrite.
The most notable differences in design are:
- SGTable utilizes BorrowedPage, AsPageIter and VmallocPageIter from my patch
series in [1].
- SGTable is a transparent wrapper over either struct Owned<P> (where P is
the provider of the backing pages) or struct Borrowed, which by itself is a
transparent wrapper over Opaque<bindings::sg_table>, i.e. either
SGTable<Owned<P>> or just SGTable (which is equivalent to
SGTable<Borrowed>.
- `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.
- As a consequence, a borrowed SG table can be created with
SGTable::as_ref(), which returns a &'a SGTable, just like similar
existing abstractions.
An owned SGTable is created with SGTable::new(), which returns an
impl PinInit<SGTable<Owned<P>>, Error>, such that it can be initialized
directly within existing private data memory allocations while providing
the required pin guarantees.
- SGTable<Owned<P>> uses an inner type Devres<DmaMapSgt> to ensure that the
DMA mapping can't out-live device unbind.
- SGTable<Owned<P>> uses pin-init for initialization.
This patch series depends on [1] (branch containing the patches in [2]). A
branch containing this series (including dependencies) can be found in [3];
Abdiel's latest series can be found in [4].
[1] https://lore.kernel.org/rust-for-linux/20250820145434.94745-1-dakr@kernel.org/
[2] https://git.kernel.org/pub/scm/linux/kernel/git/dakr/linux.git/log/?h=page-iter
[3] https://git.kernel.org/pub/scm/linux/kernel/git/dakr/linux.git/log/?h=scatterlist
[4] https://lore.kernel.org/lkml/20250718103359.1026240-1-abdiel.janulgue@gmail.com/
Changes in v2:
- Switch to an enum impl for DmaDirection utilizing compile time boundary
checks.
- Add missing Send/ Sync impls.
- Rename as_ref() to from_raw().
- Add a bunch of inline annotations.
- Add a patch to introduce a typedef for dma_addr_t.
- Let dma_len() return ResourceSize.
- Add addional invariant to DmaMapSgt.
- In RawSGTable::new(), pass pages as mutable slice reference.
- Avoid casts when deriving max_segment in Owned::new().
Danilo Krummrich (5):
rust: dma: implement DataDirection
rust: dma: add type alias for bindings::dma_addr_t
rust: scatterlist: Add type-state abstraction for sg_table
samples: rust: dma: add sample code for SGTable
MAINTAINERS: rust: dma: add scatterlist files
MAINTAINERS | 4 +-
drivers/gpu/nova-core/falcon.rs | 4 +-
rust/bindings/bindings_helper.h | 1 +
rust/helpers/helpers.c | 1 +
rust/helpers/scatterlist.c | 24 ++
rust/kernel/dma.rs | 86 +++++-
rust/kernel/lib.rs | 1 +
rust/kernel/scatterlist.rs | 475 ++++++++++++++++++++++++++++++++
samples/rust/rust_dma.rs | 35 ++-
9 files changed, 615 insertions(+), 16 deletions(-)
create mode 100644 rust/helpers/scatterlist.c
create mode 100644 rust/kernel/scatterlist.rs
base-commit: 27941214d368f3c17ed26a72662fc453bcc81b9d
--
2.50.1
next reply other threads:[~2025-08-20 16:54 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-20 16:52 Danilo Krummrich [this message]
2025-08-20 16:52 ` [PATCH v2 1/5] rust: dma: implement DataDirection Danilo Krummrich
2025-08-22 11:38 ` Alice Ryhl
2025-08-23 11:09 ` Alexandre Courbot
2025-08-20 16:52 ` [PATCH v2 2/5] rust: dma: add type alias for bindings::dma_addr_t Danilo Krummrich
2025-08-22 11:38 ` Alice Ryhl
2025-08-23 11:10 ` Alexandre Courbot
2025-08-20 16:52 ` [PATCH v2 3/5] rust: scatterlist: Add type-state abstraction for sg_table Danilo Krummrich
2025-08-20 17:14 ` Daniel Almeida
2025-08-22 11:44 ` Alice Ryhl
2025-08-22 11:48 ` Danilo Krummrich
2025-08-22 11:52 ` Alice Ryhl
2025-08-22 11:54 ` Danilo Krummrich
2025-08-23 12:44 ` Alexandre Courbot
2025-08-23 13:22 ` Alexandre Courbot
2025-08-23 13:48 ` Danilo Krummrich
2025-08-23 14:12 ` Alexandre Courbot
2025-08-23 14:32 ` Jason Gunthorpe
2025-08-23 14:57 ` Danilo Krummrich
2025-08-23 13:47 ` Alexandre Courbot
2025-08-23 13:57 ` Danilo Krummrich
2025-08-23 14:16 ` Alexandre Courbot
2025-08-23 14:20 ` Danilo Krummrich
2025-08-23 14:29 ` Alexandre Courbot
2025-08-20 16:52 ` [PATCH v2 4/5] samples: rust: dma: add sample code for SGTable Danilo Krummrich
2025-08-20 16:52 ` [PATCH v2 5/5] MAINTAINERS: rust: dma: add scatterlist files Danilo Krummrich
2025-08-22 11:45 ` [PATCH v2 0/5] Rust infrastructure for sg_table and scatterlist Alice Ryhl
2025-08-22 13:31 ` Alexandre Courbot
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=20250820165431.170195-1-dakr@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 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.