Skip to content

Commit 05aa6fb

Browse files
author
Danilo Krummrich
committed
rust: scatterlist: Add abstraction for sg_table
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::from_raw()` 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. Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Tested-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Co-developed-by: Abdiel Janulgue <abdiel.janulgue@gmail.com> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@gmail.com> Link: https://lore.kernel.org/r/20250828133323.53311-4-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
1 parent c7081ec commit 05aa6fb

4 files changed

Lines changed: 517 additions & 0 deletions

File tree

rust/helpers/helpers.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "rcu.c"
4040
#include "refcount.c"
4141
#include "regulator.c"
42+
#include "scatterlist.c"
4243
#include "security.c"
4344
#include "signal.c"
4445
#include "slab.c"

rust/helpers/scatterlist.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include <linux/dma-direction.h>
4+
5+
dma_addr_t rust_helper_sg_dma_address(struct scatterlist *sg)
6+
{
7+
return sg_dma_address(sg);
8+
}
9+
10+
unsigned int rust_helper_sg_dma_len(struct scatterlist *sg)
11+
{
12+
return sg_dma_len(sg);
13+
}
14+
15+
struct scatterlist *rust_helper_sg_next(struct scatterlist *sg)
16+
{
17+
return sg_next(sg);
18+
}
19+
20+
void rust_helper_dma_unmap_sgtable(struct device *dev, struct sg_table *sgt,
21+
enum dma_data_direction dir, unsigned long attrs)
22+
{
23+
return dma_unmap_sgtable(dev, sgt, dir, attrs);
24+
}

rust/kernel/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub mod print;
114114
pub mod rbtree;
115115
pub mod regulator;
116116
pub mod revocable;
117+
pub mod scatterlist;
117118
pub mod security;
118119
pub mod seq_file;
119120
pub mod sizes;

0 commit comments

Comments
 (0)