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

Reply via email to