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

Reply via email to