projects/linux·commit b7ed2b6f

rust: alloc: Fix `ArrayLayout` allocations

b7ed2b6f · Asahi Lina <[email protected]> · 2024-11-23 19:29:38 +09:00

We were accidentally allocating a layout for the *square* of the object
size due to a variable shadowing mishap.

Fixes memory bloat and page allocation failures in drm/asahi.

Reported-by: Janne Grunau <[email protected]>
Fixes: 9e7bbfa18276 ("rust: alloc: introduce `ArrayLayout`")
Signed-off-by: Asahi Lina <[email protected]>
Acked-by: Danilo Krummrich <[email protected]>
Reviewed-by: Neal Gompa <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Miguel Ojeda <[email protected]>
Commit
b7ed2b6f4e8d7f64649795e76ee9db67300de8eb
Parents
b160dc46

Changes

1 files changed · +1 −1

FileStatusAddDelContent
rust/kernel/alloc/layout.rsmodified+1−1View file

rust/kernel/alloc/layout.rs

View file
diff --git a/rust/kernel/alloc/layout.rs b/rust/kernel/alloc/layout.rs
index 7e0c2f4..4b3cd7f 100644
--- a/rust/kernel/alloc/layout.rs
+++ b/rust/kernel/alloc/layout.rs
@@ -45,7 +45,7 @@ impl<T> ArrayLayout<T> {
/// When `len * size_of::<T>()` overflows or when `len * size_of::<T>() > isize::MAX`.
pub const fn new(len: usize) -> Result<Self, LayoutError> {
match len.checked_mul(core::mem::size_of::<T>()) {
- Some(len) if len <= ISIZE_MAX => {
+ Some(size) if size <= ISIZE_MAX => {
// INVARIANT: We checked above that `len * size_of::<T>() <= isize::MAX`.
Ok(Self {
len,