]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu/userq: move mqd_destroy to later stage to keep core obj valid
authorSunil Khatri <sunil.khatri@amd.com>
Wed, 20 May 2026 10:55:50 +0000 (16:25 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 27 May 2026 16:01:35 +0000 (12:01 -0400)
mqd_destroy cleans up queue core objects like mqd and fw_object
which are needed for any pending fence to signal properly.

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>
(cherry picked from commit 4ad65d610096498c8e265615aba42b3c47441bb5)

drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c

index a93f5c238e55f7c144036300b4cfae5bf1df02d9..28a1849e7dcd1038b312b0c4daccf4b1bea658e4 100644 (file)
@@ -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);
@@ -541,15 +539,15 @@ static int
 amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_queue *queue)
 {
        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 = adev->userq_funcs[queue->queue_type];
+       struct amdgpu_vm *vm = queue->vm;
        int r = 0;
 
        cancel_delayed_work_sync(&uq_mgr->resume_work);
 
        /* Cancel any pending hang detection work and cleanup */
        cancel_delayed_work_sync(&queue->hang_detect_work);
+
        mutex_lock(&uq_mgr->userq_mutex);
        amdgpu_userq_wait_for_last_fence(queue);
 
@@ -566,6 +564,7 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
        amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
        amdgpu_bo_unreserve(vm->root.bo);
        list_del(&queue->userq_va_list);
+       uq_funcs->mqd_destroy(queue);
        queue->userq_mgr = NULL;
 
        amdgpu_bo_reserve(queue->db_obj.obj, true);