Re: [PATCH] rust: alloc: Fix `ArrayLayout` allocations

From: Danilo Krummrich
Date: Sat Nov 23 2024 - 15:08:46 EST


On Sat, Nov 23, 2024 at 07:29:38PM +0900, Asahi Lina wrote:
> 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 <j@xxxxxxxxxx>
> Fixes: 9e7bbfa18276 ("rust: alloc: introduce `ArrayLayout`")
> Signed-off-by: Asahi Lina <lina@xxxxxxxxxxxxx>

Good catch!

Acked-by: Danilo Krummrich <dakr@xxxxxxxxxx>

(I'm just back from moving and just starting to catch up on what was going on
in the last few weeks.)

Is this related to the performance regression that has been observed by Andreas?
Or did it turn out to be a false positive?

- Danilo

> ---
> rust/kernel/alloc/layout.rs | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/rust/kernel/alloc/layout.rs b/rust/kernel/alloc/layout.rs
> index 7e0c2f46157b772248450a77ff445091e17fdfd7..4b3cd7fdc816c158e63ac74014cbfc0794547e81 100644
> --- a/rust/kernel/alloc/layout.rs
> +++ b/rust/kernel/alloc/layout.rs
> @@ -45,7 +45,7 @@ pub const fn empty() -> Self {
> /// 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,
>
> ---
> base-commit: b2603f8ac8217bc59f5c7f248ac248423b9b99cb
> change-id: 20241123-rust-fix-arraylayout-0b1009d89fb7
>
> Cheers,
> ~~ Lina
>