]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu/userq: unmap is to be called before freeing doorbell/wptr bo
authorSunil Khatri <sunil.khatri@amd.com>
Mon, 13 Apr 2026 06:08:46 +0000 (11:38 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 19:41:12 +0000 (15:41 -0400)
Unmap the queue after freeing doorbell and wptr memory is completely
wrong. Any operation on the queue needs the doorbell and wptr to be
valid and hence fixing the ordering.

Also since we are using amdgpu_bo_reserve in non interruptrable mode
so there is no need to check for its return values.

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 31510d7fc0e90e3873ad32681f97b8fe1589794b..ea63273b8be6454f08d07a86d6a4093a076bdb83 100644 (file)
@@ -639,21 +639,6 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
        queue->hang_detect_fence = NULL;
        amdgpu_userq_wait_for_last_fence(queue);
 
-       r = amdgpu_bo_reserve(queue->db_obj.obj, true);
-       if (!r) {
-               amdgpu_bo_unpin(queue->db_obj.obj);
-               amdgpu_bo_unreserve(queue->db_obj.obj);
-       }
-       amdgpu_bo_unref(&queue->db_obj.obj);
-
-       r = amdgpu_bo_reserve(queue->wptr_obj.obj, true);
-       if (!r) {
-               amdgpu_bo_unpin(queue->wptr_obj.obj);
-               amdgpu_bo_unreserve(queue->wptr_obj.obj);
-       }
-       amdgpu_bo_unref(&queue->wptr_obj.obj);
-
-       atomic_dec(&uq_mgr->userq_count[queue->queue_type]);
 #if defined(CONFIG_DEBUG_FS)
        debugfs_remove_recursive(queue->debugfs_queue);
 #endif
@@ -664,6 +649,19 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
                drm_warn(adev_to_drm(uq_mgr->adev), "trying to destroy a HW mapping userq\n");
                queue->state = AMDGPU_USERQ_STATE_HUNG;
        }
+
+       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);
+
+       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);