Use amdgpu_userq_destroy_object to unpin and unref the queue core objects and rearrange the code to achieve that cleanly.
Signed-off-by: Sunil Khatri <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 17 +++++------------ drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 3 ++- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c index 758bf099f0bc..7b86b70129af 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -417,12 +417,10 @@ static void amdgpu_userq_cleanup(struct amdgpu_usermode_queue *queue) { struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; struct amdgpu_device *adev = uq_mgr->adev; - const struct amdgpu_userq_funcs *uq_funcs = adev->userq_funcs[queue->queue_type]; /* Wait for mode-1 reset to complete */ down_read(&adev->reset_domain->sem); - uq_funcs->mqd_destroy(queue); /* Use interrupt-safe locking since IRQ handlers may access these XArrays */ xa_erase_irq(&adev->userq_doorbell_xa, queue->doorbell_index); amdgpu_userq_fence_driver_free(queue); @@ -611,7 +609,7 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que struct amdgpu_device *adev = uq_mgr->adev; struct amdgpu_fpriv *fpriv = uq_mgr_to_fpriv(uq_mgr); struct amdgpu_vm *vm = &fpriv->vm; - + const struct amdgpu_userq_funcs *uq_funcs; int r = 0; cancel_delayed_work_sync(&uq_mgr->resume_work); @@ -635,16 +633,11 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que amdgpu_bo_unreserve(vm->root.bo); list_del(&queue->userq_va_list); queue->userq_mgr = NULL; + /* Destroy all the memory associate with the queue */ + uq_funcs = adev->userq_funcs[queue->queue_type]; + uq_funcs->mqd_destroy(queue); + amdgpu_userq_destroy_object(&queue->db_obj); - amdgpu_bo_reserve(queue->db_obj.obj, true); - amdgpu_bo_unpin(queue->db_obj.obj); - amdgpu_bo_unreserve(queue->db_obj.obj); - amdgpu_bo_unref(&queue->db_obj.obj); - - amdgpu_bo_reserve(queue->wptr_obj.obj, true); - amdgpu_bo_unpin(queue->wptr_obj.obj); - amdgpu_bo_unreserve(queue->wptr_obj.obj); - amdgpu_bo_unref(&queue->wptr_obj.obj); kfree(queue); pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c index 69b36ebfe7ac..ea572d924621 100644 --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c @@ -445,9 +445,10 @@ static int mes_userq_mqd_create(struct amdgpu_usermode_queue *queue, static void mes_userq_mqd_destroy(struct amdgpu_usermode_queue *queue) { - amdgpu_userq_destroy_object(&queue->fw_obj); kfree(queue->userq_prop); + amdgpu_userq_destroy_object(&queue->fw_obj); amdgpu_userq_destroy_object(&queue->mqd); + amdgpu_userq_destroy_object(&queue->wptr_obj); } static int mes_userq_preempt(struct amdgpu_usermode_queue *queue) -- 2.34.1
