[PATCH v3 1/2] rust: allocator: add unit tests of kmalloc, vmalloc and kvmalloc
From: Hui Zhu
Date: Thu Jul 24 2025 - 03:55:41 EST
From: Hui Zhu <zhuhui@xxxxxxxxxx>
Add KUnit test cases to validate the functionality of Rust allocation
wrappers (kmalloc, vmalloc, kvmalloc).
The tests include:
Basic allocation tests for each allocator using a 1024-byte Blob
structure initialized with a 0xfe pattern.
Large alignment (> PAGE_SIZE) allocation testing using an 8192-byte
aligned LargeAlignBlob structure.
Verification of allocation constraints:
- kmalloc successfully handles large alignments.
- vmalloc and kvmalloc correctly fail for unsupported large alignments.
Content verification through byte-by-byte pattern checking.
Co-developed-by: Geliang Tang <geliang@xxxxxxxxxx>
Signed-off-by: Geliang Tang <geliang@xxxxxxxxxx>
Signed-off-by: Hui Zhu <zhuhui@xxxxxxxxxx>
---
rust/kernel/alloc/allocator.rs | 57 ++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/rust/kernel/alloc/allocator.rs b/rust/kernel/alloc/allocator.rs
index aa2dfa9dca4c..430d1f664fdf 100644
--- a/rust/kernel/alloc/allocator.rs
+++ b/rust/kernel/alloc/allocator.rs
@@ -187,3 +187,60 @@ unsafe fn realloc(
unsafe { ReallocFunc::KVREALLOC.call(ptr, layout, old_layout, flags) }
}
}
+
+#[macros::kunit_tests(rust_allocator_kunit)]
+mod tests {
+ use super::*;
+ use kernel::prelude::*;
+
+ const TEST_SIZE: usize = 1024;
+ const LARGE_ALIGN_TEST_SIZE: usize = kernel::page::PAGE_SIZE * 4;
+ #[repr(align(128))]
+ struct Blob([u8; TEST_SIZE]);
+ // This structure is used to test the allocation of alignments larger
+ // than PAGE_SIZE.
+ // Since this is not yet supported, avoid accessing the contents of
+ // the structure for now.
+ #[allow(dead_code)]
+ #[repr(align(8192))]
+ struct LargeAlignBlob([u8; LARGE_ALIGN_TEST_SIZE]);
+
+ #[test]
+ fn test_kmalloc() -> Result<(), AllocError> {
+ let blob = KBox::new(Blob([0xfeu8; TEST_SIZE]), GFP_KERNEL)?;
+ for b in blob.0.as_slice().iter() {
+ assert_eq!(*b, 0xfeu8);
+ }
+
+ let blob = KBox::new(LargeAlignBlob([0xfdu8; LARGE_ALIGN_TEST_SIZE]), GFP_KERNEL)?;
+ for b in blob.0.as_slice().iter() {
+ assert_eq!(*b, 0xfdu8);
+ }
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_vmalloc() -> Result<(), AllocError> {
+ let blob = VBox::new(Blob([0xfeu8; TEST_SIZE]), GFP_KERNEL)?;
+ for b in blob.0.as_slice().iter() {
+ assert_eq!(*b, 0xfeu8);
+ }
+
+ assert!(VBox::<LargeAlignBlob>::new_uninit(GFP_KERNEL).is_err());
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_kvmalloc() -> Result<(), AllocError> {
+ let blob = KVBox::new(Blob([0xfeu8; TEST_SIZE]), GFP_KERNEL)?;
+ for b in blob.0.as_slice().iter() {
+ assert_eq!(*b, 0xfeu8);
+ }
+
+ assert!(KVBox::<LargeAlignBlob>::new_uninit(GFP_KERNEL).is_err());
+
+ Ok(())
+ }
+}
--
2.43.0