Skip to contentSkip to conversation

Rust allocator and kvec improvements

PATCH Applied Hui Zhu 3 participants 9 messages Jul 31, 2025 – Aug 15, 2025

Subsystems (2)

v7 of 8 Applied Latest is v8 →

lore
Share & tools
lore

Hui Zhu

author
#0 lore raw

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
author
#1 lore raw

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
index 63f271624428..a20111b40529 100644
@@ -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
maintainer Acked-by on v7 1/3
#2 lore raw

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 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

Quoted 4 lines

@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.

[1] https://lore.kernel.org/lkml/[email protected]/

maintainer
#3 lore raw

Re: [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 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

Quoted 4 lines
Quoted 5 lines

@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

[1] https://lore.kernel.org/lkml/[email protected]/

author
#4 lore raw

PATCH v7 2/3 rust: alloc: kvec: add doc example for as_slice method

In reply to Hui Zhu

From: 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
index 92d0ed3f302e..f57e08c64929 100644
@@ -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
author
#5 lore raw

PATCH v7 3/3 rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"

In reply to Hui Zhu

From: 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
index f57e08c64929..d71f6a1513e2 100644
@@ -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
Reviewed-by on the v7 series
#6 lore raw
In reply to Hui Zhu
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 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.

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 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(-)

--
2.43.0

maintainer
#7 lore raw
Quoted 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 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.

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. :)

maintainer Applied
#8 lore raw
In reply to Hui Zhu
Quoted 2 lines · Hui Zhu

rust: alloc: kvec: add doc example for as_slice method
rust: alloc: kvec: simplify KUnit test module name to "rust_kvec"

Applied to alloc-next, thanks!