[PATCH] drm/amdkfd: Ignore user ctl_stack_size on queue creation on gfx9

Felix Kuehling felix.kuehling at amd.com
Fri Jul 18 19:34:38 UTC 2025


On 2025-07-18 12:09, Sunday Clement wrote:
> For security reasons it is safer to have the kernel driver handle
> calculating the sizing for the control stack on queue creation for
> gfx9, rather than having it done in userspace where arbitrarily large
> values can be passed in potentially wasting space in VMID0.

I thought we already did that. See these two commits:

commit 629568d25fea8ece4f65073f039aeef4e240ab67
Author: Philip Yang <Philip.Yang at amd.com>
Date:   Wed Jun 26 15:03:05 2024 -0400

     drm/amdkfd: Validate queue cwsr area and eop buffer size

     When creating KFD user compute queue, check if queue eop buffer size,
     cwsr area size, ctl stack size equal to the size of KFD node
     properities.

     Check the entire cwsr area which may split into multiple svm ranges
     aligned to granularity boundary.

     Signed-off-by: Philip Yang <Philip.Yang at amd.com>
     Reviewed-by: Felix Kuehling <felix.kuehling at amd.com>
     Acked-by: Christian König <christian.koenig at amd.com>
     Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

commit 517fff221c1e6b8a8db69e7a440116caee120ff5
Author: Philip Yang <Philip.Yang at amd.com>
Date:   Wed Jun 26 14:52:28 2024 -0400

     drm/amdkfd: Store queue cwsr area size to node properties

     Use the queue eop buffer size, cwsr area size, ctl stack size
     calculation from Thunk, store the value to KFD node properties.

     Those will be used to validate queue eop buffer size, cwsr area size,
     ctl stack size when creating KFD user compute queue.

     Those will be exposed to user space via sysfs KFD node properties, to
     remove the duplicate calculation code from Thunk.

     Signed-off-by: Philip Yang <Philip.Yang at amd.com>
     Reviewed-by: Felix Kuehling <felix.kuehling at amd.com>
     Acked-by: Christian König <christian.koenig at amd.com>
     Signed-off-by: Alex Deucher <alexander.deucher at amd.com>


This stores the CWSR context save area, control stack and EOP buffer 
sizes in kfd_node_properties and validates the sizes from user mode 
during queue creation.

Regards,
   Felix


>
> Signed-off-by: Sunday Clement <Sunday.Clement at amd.com>
> ---
>   .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c   | 19 ++++++++++++++++++-
>   1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> index 97933d2a3803..8841411050a3 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> @@ -135,8 +135,25 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_node *node,
>   		mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);
>   		if (!mqd_mem_obj)
>   			return NULL;
> +
> +		uint16_t xcc_mask = node->adev->gfx.xcc_mask;
> +		uint32_t num_xccs = NUM_XCC(xcc_mask);
> +		uint32_t num_cu = node->adev->gfx.cu_info.number;
> +
> +		if (num_xccs == 0) {
> +			pr_err("Invalid XCC mask: %u\n", xcc_mask);
> +			kfree(mqd_mem_obj);
> +			return NULL;
> +		}
> +
> +		num_cu /= num_xccs;
> +
> +		uint32_t num_waves = num_cu * 40;
> +		/* Add Bytes to accommodate ContextSaveAreaHeader */
> +		uint32_t ctl_stack_size = (num_waves * 8) + 8 + 42;
> +
>   		retval = amdgpu_amdkfd_alloc_gtt_mem(node->adev,
> -			(ALIGN(q->ctl_stack_size, PAGE_SIZE) +
> +			(ALIGN(ctl_stack_size, PAGE_SIZE) +
>   			ALIGN(sizeof(struct v9_mqd), PAGE_SIZE)) *
>   			NUM_XCC(node->xcc_mask),
>   			&(mqd_mem_obj->gtt_mem),


More information about the amd-gfx mailing list