On 5/20/26 14:10, Sunil Khatri wrote:
> Remove the amdgpu_userq_create/destroy_object wrapper functions and
> use directly the kernel bo allocation function which does all the
> things which are done in wrapper.
> 
> Signed-off-by: Sunil Khatri <[email protected]>
> Suggested-by: Christian König <[email protected]>

You may want to remove all the PAGE_SIZE alignment and just replace it with 0.

The alignment here should reflect the requirement of the GPU HW, but I think we 
unfortunately doesn't know that at the moment.

Aligning it to a PAGE_SIZE so that it is CPU mapable is the job of the 
underlying allocator.

With that done Reviewed-by: Christian König <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c  | 67 ----------------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h  |  7 ---
>  drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 29 +++++++---
>  3 files changed, 21 insertions(+), 82 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index 798998d65e17..eaaffcdd6960 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -465,74 +465,7 @@ amdgpu_userq_ensure_ev_fence(struct amdgpu_userq_mgr 
> *uq_mgr,
>       dma_fence_put(ev_fence);
>  }
>  
> -int amdgpu_userq_create_object(struct amdgpu_userq_mgr *uq_mgr,
> -                            struct amdgpu_userq_obj *userq_obj,
> -                            int size)
> -{
> -     struct amdgpu_device *adev = uq_mgr->adev;
> -     struct amdgpu_bo_param bp;
> -     int r;
> -
> -     memset(&bp, 0, sizeof(bp));
> -     bp.byte_align = PAGE_SIZE;
> -     bp.domain = AMDGPU_GEM_DOMAIN_GTT;
> -     bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
> -                AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> -     bp.type = ttm_bo_type_kernel;
> -     bp.size = size;
> -     bp.resv = NULL;
> -     bp.bo_ptr_size = sizeof(struct amdgpu_bo);
> -
> -     r = amdgpu_bo_create(adev, &bp, &userq_obj->obj);
> -     if (r) {
> -             drm_file_err(uq_mgr->file, "Failed to allocate BO for userqueue 
> (%d)", r);
> -             return r;
> -     }
>  
> -     r = amdgpu_bo_reserve(userq_obj->obj, true);
> -     if (r) {
> -             drm_file_err(uq_mgr->file, "Failed to reserve BO to map (%d)", 
> r);
> -             goto free_obj;
> -     }
> -
> -     r = amdgpu_bo_pin(userq_obj->obj, AMDGPU_GEM_DOMAIN_GTT);
> -     if (r)
> -             goto unresv;
> -
> -     r = amdgpu_ttm_alloc_gart(&(userq_obj->obj)->tbo);
> -     if (r) {
> -             drm_file_err(uq_mgr->file, "Failed to alloc GART for userqueue 
> object (%d)", r);
> -             goto unpin_bo;
> -     }
> -
> -     r = amdgpu_bo_kmap(userq_obj->obj, &userq_obj->cpu_ptr);
> -     if (r) {
> -             drm_file_err(uq_mgr->file, "Failed to map BO for userqueue 
> (%d)", r);
> -             goto unpin_bo;
> -     }
> -
> -     userq_obj->gpu_addr = amdgpu_bo_gpu_offset(userq_obj->obj);
> -     amdgpu_bo_unreserve(userq_obj->obj);
> -     memset(userq_obj->cpu_ptr, 0, size);
> -     return 0;
> -
> -unpin_bo:
> -     amdgpu_bo_unpin(userq_obj->obj);
> -unresv:
> -     amdgpu_bo_unreserve(userq_obj->obj);
> -free_obj:
> -     amdgpu_bo_unref(&userq_obj->obj);
> -
> -     return r;
> -}
> -
> -void amdgpu_userq_destroy_object(struct amdgpu_userq_mgr *uq_mgr,
> -                              struct amdgpu_userq_obj *userq_obj)
> -{
> -     amdgpu_bo_kunmap(userq_obj->obj);
> -     amdgpu_bo_unpin(userq_obj->obj);
> -     amdgpu_bo_unref(&userq_obj->obj);
> -}
>  
>  static int
>  amdgpu_userq_get_doorbell_index(struct amdgpu_userq_mgr *uq_mgr,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> index 033b8a0de6b1..76ef5cfab52e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> @@ -151,13 +151,6 @@ void amdgpu_userq_mgr_cancel_reset_work(struct 
> amdgpu_device *adev);
>  void amdgpu_userq_mgr_cancel_resume(struct amdgpu_userq_mgr *userq_mgr);
>  void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr);
>  
> -int amdgpu_userq_create_object(struct amdgpu_userq_mgr *uq_mgr,
> -                            struct amdgpu_userq_obj *userq_obj,
> -                            int size);
> -
> -void amdgpu_userq_destroy_object(struct amdgpu_userq_mgr *uq_mgr,
> -                              struct amdgpu_userq_obj *userq_obj);
> -
>  void amdgpu_userq_evict(struct amdgpu_userq_mgr *uq_mgr);
>  
>  void amdgpu_userq_ensure_ev_fence(struct amdgpu_userq_mgr *userq_mgr,
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c 
> b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> index 2d95203ec58e..ebd4e90cce63 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> @@ -192,12 +192,16 @@ static int mes_userq_create_ctx_space(struct 
> amdgpu_userq_mgr *uq_mgr,
>        * for the same.
>        */
>       size = AMDGPU_USERQ_PROC_CTX_SZ + AMDGPU_USERQ_GANG_CTX_SZ;
> -     r = amdgpu_userq_create_object(uq_mgr, ctx, size);
> +     r = amdgpu_bo_create_kernel(uq_mgr->adev, size, PAGE_SIZE,
> +                                AMDGPU_GEM_DOMAIN_GTT,
> +                                &ctx->obj, &ctx->gpu_addr,
> +                                &ctx->cpu_ptr);
>       if (r) {
>               DRM_ERROR("Failed to allocate ctx space bo for userqueue, 
> err:%d\n", r);
>               return r;
>       }
>  
> +     memset(ctx->cpu_ptr, 0, size);
>       return 0;
>  }
>  
> @@ -270,13 +274,19 @@ static int mes_userq_mqd_create(struct 
> amdgpu_usermode_queue *queue,
>               return -ENOMEM;
>       }
>  
> -     r = amdgpu_userq_create_object(uq_mgr, &queue->mqd,
> -                     AMDGPU_MQD_SIZE_ALIGN(mqd_hw_default->mqd_size));
> +     r = amdgpu_bo_create_kernel(adev,
> +                                
> AMDGPU_MQD_SIZE_ALIGN(mqd_hw_default->mqd_size),
> +                                PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
> +                                &queue->mqd.obj, &queue->mqd.gpu_addr,
> +                                &queue->mqd.cpu_ptr);
>       if (r) {
>               DRM_ERROR("Failed to create MQD object for userqueue\n");
>               goto free_props;
>       }
>  
> +     memset(queue->mqd.cpu_ptr, 0,
> +            AMDGPU_MQD_SIZE_ALIGN(mqd_hw_default->mqd_size));
> +
>       /* Initialize the MQD BO with user given values */
>       userq_props->wptr_gpu_addr = mqd_user->wptr_va;
>       userq_props->rptr_gpu_addr = mqd_user->rptr_va;
> @@ -432,10 +442,12 @@ static int mes_userq_mqd_create(struct 
> amdgpu_usermode_queue *queue,
>       return 0;
>  
>  free_ctx:
> -     amdgpu_userq_destroy_object(uq_mgr, &queue->fw_obj);
> +     amdgpu_bo_free_kernel(&queue->fw_obj.obj, &queue->fw_obj.gpu_addr,
> +                           &queue->fw_obj.cpu_ptr);
>  
>  free_mqd:
> -     amdgpu_userq_destroy_object(uq_mgr, &queue->mqd);
> +     amdgpu_bo_free_kernel(&queue->mqd.obj, &queue->mqd.gpu_addr,
> +                           &queue->mqd.cpu_ptr);
>  
>  free_props:
>       kfree(userq_props);
> @@ -445,11 +457,12 @@ static int mes_userq_mqd_create(struct 
> amdgpu_usermode_queue *queue,
>  
>  static void mes_userq_mqd_destroy(struct amdgpu_usermode_queue *queue)
>  {
> -     struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr;
>  
> -     amdgpu_userq_destroy_object(uq_mgr, &queue->fw_obj);
> +     amdgpu_bo_free_kernel(&queue->fw_obj.obj, &queue->fw_obj.gpu_addr,
> +                           &queue->fw_obj.cpu_ptr);
>       kfree(queue->userq_prop);
> -     amdgpu_userq_destroy_object(uq_mgr, &queue->mqd);
> +     amdgpu_bo_free_kernel(&queue->mqd.obj, &queue->mqd.gpu_addr,
> +                           &queue->mqd.cpu_ptr);
>  }
>  
>  static int mes_userq_preempt(struct amdgpu_usermode_queue *queue)

Reply via email to