]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu/userq: unpin and unref doorbell and wptr outside mutex
authorSunil Khatri <sunil.khatri@amd.com>
Mon, 13 Apr 2026 12:53:06 +0000 (18:23 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 19:41:12 +0000 (15:41 -0400)
In amdgpu_userq_destroy once unmap_helpder is called within mutex
there is no need to hold mutex.

This helps in avoiding a deadlock between doorbell and wptr ww mutex
and we could unpin and unref these bos outside mutex safely.

Signed-off-by: Sunil Khatri <sunil.khatri@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c

index 6f328742ef68341c45723980f5bcd307e4078eb9..d5abf785ca17e38160b4cc8df7b811f475b0d720 100644 (file)
@@ -444,7 +444,6 @@ static void amdgpu_userq_cleanup(struct amdgpu_usermode_queue *queue)
        queue->fence_drv = NULL;
        queue->userq_mgr = NULL;
        list_del(&queue->userq_va_list);
-       kfree(queue);
 
        up_read(&adev->reset_domain->sem);
 }
@@ -650,6 +649,10 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
                queue->state = AMDGPU_USERQ_STATE_HUNG;
        }
 
+       atomic_dec(&uq_mgr->userq_count[queue->queue_type]);
+       amdgpu_userq_cleanup(queue);
+       mutex_unlock(&uq_mgr->userq_mutex);
+
        amdgpu_bo_reserve(queue->db_obj.obj, true);
        amdgpu_bo_unpin(queue->db_obj.obj);
        amdgpu_bo_unreserve(queue->db_obj.obj);
@@ -659,11 +662,8 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
        amdgpu_bo_unpin(queue->wptr_obj.obj);
        amdgpu_bo_unreserve(queue->wptr_obj.obj);
        amdgpu_bo_unref(&queue->wptr_obj.obj);
+       kfree(queue);
 
-       atomic_dec(&uq_mgr->userq_count[queue->queue_type]);
-
-       amdgpu_userq_cleanup(queue);
-       mutex_unlock(&uq_mgr->userq_mutex);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
 
        return r;