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)
