mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
rust: alloc: satisfy POSIX alignment requirement
ISO C's `aligned_alloc` is partially implementation-defined; on some systems it inherits stricter requirements from POSIX's `posix_memalign`. This causes the call added in commitdd09538fb4("rust: alloc: implement `Cmalloc` in module allocator_test") to fail on macOS because it doesn't meet the requirements of `posix_memalign`. Adjust the call to meet the POSIX requirement and add a comment. This fixes failures in `make rusttest` on macOS. Acked-by: Danilo Krummrich <dakr@kernel.org> Cc: stable@vger.kernel.org Fixes:dd09538fb4("rust: alloc: implement `Cmalloc` in module allocator_test") Signed-off-by: Tamir Duberstein <tamird@gmail.com> Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://lore.kernel.org/r/20250213-aligned-alloc-v7-1-d2a2d0be164b@gmail.com [ Added Cc: stable. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
committed by
Miguel Ojeda
parent
df27cef153
commit
ff64846bee
@@ -62,6 +62,24 @@ unsafe impl Allocator for Cmalloc {
|
||||
));
|
||||
}
|
||||
|
||||
// ISO C (ISO/IEC 9899:2011) defines `aligned_alloc`:
|
||||
//
|
||||
// > The value of alignment shall be a valid alignment supported by the implementation
|
||||
// [...].
|
||||
//
|
||||
// As an example of the "supported by the implementation" requirement, POSIX.1-2001 (IEEE
|
||||
// 1003.1-2001) defines `posix_memalign`:
|
||||
//
|
||||
// > The value of alignment shall be a power of two multiple of sizeof (void *).
|
||||
//
|
||||
// and POSIX-based implementations of `aligned_alloc` inherit this requirement. At the time
|
||||
// of writing, this is known to be the case on macOS (but not in glibc).
|
||||
//
|
||||
// Satisfy the stricter requirement to avoid spurious test failures on some platforms.
|
||||
let min_align = core::mem::size_of::<*const crate::ffi::c_void>();
|
||||
let layout = layout.align_to(min_align).map_err(|_| AllocError)?;
|
||||
let layout = layout.pad_to_align();
|
||||
|
||||
// SAFETY: Returns either NULL or a pointer to a memory allocation that satisfies or
|
||||
// exceeds the given size and alignment requirements.
|
||||
let dst = unsafe { libc_aligned_alloc(layout.align(), layout.size()) } as *mut u8;
|
||||
|
||||
Reference in New Issue
Block a user