Unpin and unref the door bell obj if queue creation fails before
initialization is complete.

Signed-off-by: Sunil Khatri <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index f1873f632547..4a50f6536f8d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -782,7 +782,7 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
        r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
        if (r) {
                drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
-               goto clean_mapping;
+               goto clean_doorbell;
        }
 
        r = uq_funcs->mqd_create(queue, &args->in);
@@ -851,6 +851,11 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
        uq_funcs->mqd_destroy(queue);
 clean_fence_driver:
        amdgpu_userq_fence_driver_free(queue);
+clean_doorbell:
+       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);
 clean_mapping:
        amdgpu_bo_reserve(fpriv->vm.root.bo, true);
        amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
-- 
2.34.1

Reply via email to