RE: [PATCH] drm/amdkfd: Reject zero-sized AQL queue allocations after size halving

"Clement, Sunday" <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <CY8PR12MB75631E1DF4CD49C84275057B9FA62@CY8PR12MB7563.namprd12.prod.outlook.com>
AMD General

ping

> -----Original Message-----
> From: Clement, Sunday <[email protected]>
> Sent: Thursday, August 6, 2026 11:11 AM
> To: [email protected]
> Cc: Clement, Sunday <[email protected]>; Yang, Philip
> <[email protected]>; Deucher, Alexander <[email protected]>
> Subject: [PATCH] drm/amdkfd: Reject zero-sized AQL queue allocations after size
> halving
>
> KFD_IOC_ALLOC_MEMORY_OF_GPU with flag
> KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM and size=1 triggers the AQL
> wraparound workaround (size >>= 1), reducing size to 0. The resulting zero passes
> through PAGE_ALIGN(0) = 0 without validation, bypassing the per-process VRAM
> quota check in reserve_mem_limit() (vram_used + 0 > vram_available is always
> false).
>
> The fix adds post-halving zero-size validation in the primary allocation path
> (amdgpu_amdkfd_gpuvm.c). The check happens after size halving but before
> reserve_mem_limit(), and uses err_alignment_size error path to properly clean up
> the allocated kgd_mem structure and mutex.
>
> Signed-off-by: Sunday Clement <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 6 ++++++
>  drivers/gpu/drm/amd/amdkfd/kfd_chardev.c         | 3 ++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index 1e71829e0fc6..90a4a68478f8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -1795,6 +1795,11 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>               size >>= 1;
>       aligned_size = PAGE_ALIGN(size);
>
> +     if(!aligned_size) { // reject AQL queue with size < 2
> +             ret = -EINVAL;
> +             goto err_alignment_size;
> +     }
> +
>       (*mem)->alloc_flags = flags;
>
>       amdgpu_sync_create(&(*mem)->sync);
> @@ -1886,6 +1891,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>       amdgpu_amdkfd_unreserve_mem_limit(adev, aligned_size, flags,
> xcp_id);
>  err_reserve_limit:
>       amdgpu_sync_free(&(*mem)->sync);
> +err_alignment_size:
>       mutex_destroy(&(*mem)->lock);
>       if (gobj)
>               drm_gem_object_put(gobj);
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> index 309510e23315..bb0a2c615326 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> @@ -1200,7 +1200,8 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file
> *filep,
>
>               if (flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM)
>                       size >>= 1;
> -             atomic64_add(PAGE_ALIGN(size), &pdd->vram_usage);
> +             size = PAGE_ALIGN(size);
> +             atomic64_add(size, &pdd->vram_usage);
>       }
>
>       mutex_unlock(&p->mutex);
> --
> 2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.