[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250815171058.299270-1-dakr@kernel.org>
Date: Fri, 15 Aug 2025 19:10:01 +0200
From: Danilo Krummrich <dakr@...nel.org>
To: akpm@...ux-foundation.org,
ojeda@...nel.org,
alex.gaynor@...il.com,
boqun.feng@...il.com,
gary@...yguo.net,
bjorn3_gh@...tonmail.com,
lossin@...nel.org,
a.hindborg@...nel.org,
aliceryhl@...gle.com,
tmgross@...ch.edu,
abdiel.janulgue@...il.com,
acourbot@...dia.com,
jgg@...pe.ca,
lyude@...hat.com,
robin.murphy@....com,
daniel.almeida@...labora.com
Cc: rust-for-linux@...r.kernel.org,
linux-kernel@...r.kernel.org,
Danilo Krummrich <dakr@...nel.org>
Subject: [PATCH 0/4] Rust infrastructure for sg_table and scatterlist
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/20250814093427.19629-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/
Danilo Krummrich (4):
rust: dma: implement DataDirection
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 +-
rust/bindings/bindings_helper.h | 1 +
rust/helpers/helpers.c | 1 +
rust/helpers/scatterlist.c | 24 ++
rust/kernel/dma.rs | 41 +++
rust/kernel/lib.rs | 1 +
rust/kernel/scatterlist.rs | 433 ++++++++++++++++++++++++++++++++
samples/rust/rust_dma.rs | 35 ++-
8 files changed, 530 insertions(+), 10 deletions(-)
create mode 100644 rust/helpers/scatterlist.c
create mode 100644 rust/kernel/scatterlist.rs
base-commit: a66548bf306b60441ed2ea6b034a0cd69f464e74
--
2.50.1
Powered by blists - more mailing lists