Rust allocator and kvec improvements
Subsystems (2)
v7 cover Rust allocator and kvec improvements
From: Hui Zhu <[email protected]>
This series adds tests and docs for Rust kernel components:
Patch 1 adds KUnit tests for allocator alignment guarantees. Patch 2 documents KVec::as_slice with a usage example. Patch 3 simplifies KVec test module naming convention.
Both patches are co-developed with Geliang Tang. Based on [1]. Tested on x86_64 using KUnit.
Changelog:
v7:
Updated according to the comments of Miguel.
v6:
According to the comments of Danilo, updated test for allocator.rs and allocator rebase onto [1].
v5:
According to the comments of Danilo, change to use generic struct and allocator Generics in allocator.rs.
v4:
According to the comments of, add the error check for push. v3:
According to the comments of Danilo and Boqun, move KVec test to doc example and move VBox to allocator unit tests.
v2:
According to the comments of Danilo, updated the commit to samples the usage of VBox and KVec.
Hui Zhu (3):
rust: allocator: add KUnit tests for alignment guarantees
rust: alloc: kvec: add doc example for as_slice method
rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"
rust/kernel/alloc/allocator.rs | 56 ++++++++++++++++++++++++++++++++++ rust/kernel/alloc/kvec.rs | 12 +++++++- 2 files changed, 67 insertions(+), 1 deletion(-)
Signature · 1 line
2.43.0
PATCH v7 1/3 rust: allocator: add KUnit tests for alignment guarantees
From: Hui Zhu <[email protected]>
Add a test module to verify memory alignment guarantees for Rust kernel allocators.
The tests cover Kmalloc, Vmalloc and KVmalloc allocators with both standard and large page-aligned allocations.
Key features of the tests:
1. Creates alignment-constrained types:
- 128-byte aligned Blob
- 8192-byte (4-page) aligned LargeAlignBlob
2. Validates allocators using TestAlign helper which:
- Checks address alignment masks
- Supports uninitialized allocations
3. Tests all three allocators with both alignment requirements:
- Kmalloc with 128B and 8192B
- Vmalloc with 128B and 8192B
- KVmalloc with 128B and 8192B
--- rust/kernel/alloc/allocator.rs | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
rust/kernel/alloc/allocator.rs +56 -0
@@ -184,3 +184,59 @@ unsafe fn realloc(unsafe {ReallocFunc ::KVREALLOC .call (ptr, layout, old_layout, flags, nid) } } } + +#[macros::kunit_tests(rust_allocator)] +mod tests { +use super ::*; +use core::mem::MaybeUninit ; +use kernel::prelude::*; + +#[test] +fn test_alignment () ->Result { +const TEST_SIZE :usize =1024 ; +const TEST_LARGE_ALIGN_SIZE :usize = kernel::page::PAGE_SIZE *4 ; + +// These two structs are used to test allocating aligned memory. +// they don't need to be accessed, so they're marked as dead_code. +#[expect(dead_code)] +#[repr(align( 128 ))] +struct Blob ([u8 ;TEST_SIZE ]); +#[expect(dead_code)] +#[repr(align( 8192 ))] +struct LargeAlignBlob ([u8 ;TEST_LARGE_ALIGN_SIZE ]); + +struct TestAlign <T ,A :Allocator >(Box <MaybeUninit <T >,A >); +impl <T ,A :Allocator >TestAlign <T ,A > { +fn new () ->Result <Self > { +Ok (Self (Box ::<_ ,A >::new_uninit (GFP_KERNEL )?)) + } + +fn is_aligned_to (&self, align:usize ) ->bool { +assert! (align.is_power_of_two ()); + +let addr = self.0 .as_ptr ()as usize ; + addr & (align -1 ) ==0 + } + } + +let ta =TestAlign ::<Blob ,Kmalloc >::new ()?; +assert! (ta.is_aligned_to (128 )); + +let ta =TestAlign ::<LargeAlignBlob ,Kmalloc >::new ()?; +assert! (ta.is_aligned_to (8192 )); + +let ta =TestAlign ::<Blob ,Vmalloc >::new ()?; +assert! (ta.is_aligned_to (128 )); + +let ta =TestAlign ::<LargeAlignBlob ,Vmalloc >::new ()?; +assert! (ta.is_aligned_to (8192 )); + +let ta =TestAlign ::<Blob ,KVmalloc >::new ()?; +assert! (ta.is_aligned_to (128 )); + +let ta =TestAlign ::<LargeAlignBlob ,KVmalloc >::new ()?; +assert! (ta.is_aligned_to (8192 )); + +Ok (()) + } +}
Signature · 1 line
2.43.0
Re: [PATCH v7 1/3] rust: allocator: add KUnit tests for alignment guarantees
Quoted 19 lines · Hui Zhu
From: Hui Zhu <[email protected]>
Add a test module to verify memory alignment guarantees for Rust kernel allocators.
The tests coverKmalloc,VmallocandKVmallocallocators with both standard and large page-aligned allocations.Key features of the tests:
1. Creates alignment-constrained types:
- 128-byte alignedBlob
- 8192-byte (4-page) alignedLargeAlignBlob
2. Validates allocators usingTestAlignhelper which:
- Checks address alignment masks
- Supports uninitialized allocations
3. Tests all three allocators with both alignment requirements:
- Kmalloc with 128B and 8192B
- Vmalloc with 128B and 8192B
- KVmalloc with 128B and 8192B
Quoted 4 lines
Co-developed-by Geliang Tang <[email protected]>Signed-off-by Geliang Tang <[email protected]>Signed-off-by Hui Zhu <[email protected]>Reviewed-by Kunwu Chan <[email protected]>
@Andrew: Can you please pick this one up once we land Vitaly's series [1]? I'll take the other two patches of the series through the Rust alloc tree once -rc1 is out.
Danilo Krummrich
maintainerRe: [PATCH v7 1/3] rust: allocator: add KUnit tests for alignment guarantees
Quoted 25 lines · Danilo Krummrich
Quoted 19 lines · Hui Zhu
From: Hui Zhu <[email protected]>
Add a test module to verify memory alignment guarantees for Rust kernel allocators.
The tests coverKmalloc,VmallocandKVmallocallocators with both standard and large page-aligned allocations.Key features of the tests:
1. Creates alignment-constrained types:
- 128-byte alignedBlob
- 8192-byte (4-page) alignedLargeAlignBlob
2. Validates allocators usingTestAlignhelper which:
- Checks address alignment masks
- Supports uninitialized allocations
3. Tests all three allocators with both alignment requirements:
- Kmalloc with 128B and 8192B
- Vmalloc with 128B and 8192B
- KVmalloc with 128B and 8192BQuoted 4 lines
Co-developed-by Geliang Tang <[email protected]>Signed-off-by Geliang Tang <[email protected]>Signed-off-by Hui Zhu <[email protected]>Reviewed-by Kunwu Chan <[email protected]>
Quoted 5 lines
Acked-by Danilo Krummrich <[email protected]>@Andrew: Can you please pick this one up once we land Vitaly's series [1]? I'll take the other two patches of the series through the Rust alloc tree once -rc1 is out.
Just a reminder for this one to be picked up; I gave it a quick shot on top of mm-everything and everything looks fine..
Quoted 1 line
PATCH v7 2/3 rust: alloc: kvec: add doc example for as_slice method
In reply to Hui ZhuFrom: Hui Zhu <[email protected]>
Add a practical usage example to the documentation of KVec::as_slice() showing how to:
Create a new KVec.
Push elements into it.
Convert to a slice via as_slice().
--- rust/kernel/alloc/kvec.rs | 10 ++++++++++ 1 file changed, 10 insertions(+)
rust/kernel/alloc/kvec.rs +10 -0
@@ -224,6 +224,16 @@ unsafe fn dec_len(&mut self, count: usize) -> &mut [T] { }/// Returns a slice of the entire vector. +/// +/// # Examples +/// +/// ``` +/// let mut v = KVec::new(); +/// v.push(1, GFP_KERNEL)?; +/// v.push(2, GFP_KERNEL)?; +/// assert_eq!(v.as_slice(), &[1, 2]); +/// # Ok::<(), Error>(()) +/// ``` #[inline] pub fn as_slice (&self) -> &[T ] { self
Signature · 1 line
2.43.0
PATCH v7 3/3 rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"
In reply to Hui ZhuFrom: Hui Zhu <[email protected]>
Remove redundant "_kunit" suffix from test module name.
The naming is now consistent with other Rust components as the test context is already implied by the #[kunit_tests] macro and test module location.
--- rust/kernel/alloc/kvec.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/alloc/kvec.rs +1 -1
@@ -1311,7 +1311,7 @@ fn drop(&mut self) { } } -#[macros::kunit_tests(rust_kvec_kunit)] +#[macros::kunit_tests(rust_kvec)] mod tests {use super ::*;use crate ::prelude::*;
Signature · 1 line
2.43.0
Quoted 11 lines · Hui Zhu
From: Hui Zhu <[email protected]>
This series adds tests and docs for Rust kernel components:
Patch 1 adds KUnit tests for allocator alignment guarantees. Patch 2 documentsKVec::as_slicewith a usage example. Patch 3 simplifies KVec test module naming convention.Both patches are co-developed with Geliang Tang. Based on [1]. Tested on
x86_64using KUnit.
This series looks good to me from a KUnit perspective. I've also tested it out across a bunch of architectures (UML, x86_64, arm, arm64) with no problems.
A few minor notes:
- You should squash patch 3 into patch 1: there's no need to introduce the test with one name only to rename it in a later patch.
- The link to [1] is missing in this cover letter. (But at least the test fails nicely without it!)
Otherwise, looks good!
The whole series is:
Cheers,
-- David
Quoted 31 lines
Changelog:
v7:
Updated according to the comments of Miguel.
v6:
According to the comments of Danilo, updated test forallocator.rsand allocator rebase onto [1].
v5:
According to the comments of Danilo, change to use generic struct and allocator Generics inallocator.rs.
v4:
According to the comments of, add the error check for push. v3:
According to the comments of Danilo and Boqun, move KVec test to doc example and move VBox to allocator unit tests.
v2:
According to the comments of Danilo, updated the commit to samples the usage of VBox and KVec.Hui Zhu (3):
rust: allocator: add KUnit tests for alignment guarantees
rust: alloc: kvec: add doc example foras_slicemethod
rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"rust/kernel/alloc/allocator.rs | 56 ++++++++++++++++++++++++++++++++++ rust/kernel/alloc/kvec.rs | 12 +++++++- 2 files changed, 67 insertions(+), 1 deletion(-)--
2.43.0
Danilo Krummrich
maintainerQuoted 13 lines · David Gow
Quoted 11 lines · Hui Zhu
From: Hui Zhu <[email protected]>
This series adds tests and docs for Rust kernel components:
Patch 1 adds KUnit tests for allocator alignment guarantees. Patch 2 documentsKVec::as_slicewith a usage example. Patch 3 simplifies KVec test module naming convention.Both patches are co-developed with Geliang Tang. Based on [1]. Tested on
x86_64using KUnit.
Quoted 7 lines
This series looks good to me from a KUnit perspective. I've also tested it out across a bunch of architectures (UML,
x86_64, arm, arm64) with no problems.A few minor notes:
- You should squash patch 3 into patch 1: there's no need to introduce the test with one name only to rename it in a later patch.
The test introduced in patch 1 is not the one renamed in patch 3. :)
Quoted 2 lines · Hui Zhu
rust: alloc: kvec: add doc example for
as_slicemethod
rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"
Applied to alloc-next, thanks!