]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu/userq: create_mqd does not need userq_mutex
authorSunil Khatri <sunil.khatri@amd.com>
Thu, 9 Apr 2026 07:29:33 +0000 (12:59 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 19:41:12 +0000 (15:41 -0400)
Reshuffle the code to run create_mqd outside the mutex.
code here is mostly setting up software structure init
before actually registering the userqueue in the xa and
to the driver.

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 a0a45c5e6335f188380d66e10c1ce8224fdd3fdc..6c76cf4ff38064868c753010bcb86a722c9d920a 100644 (file)
@@ -793,14 +793,14 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
                goto clean_mapping;
        }
 
-       amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr);
-
        r = uq_funcs->mqd_create(queue, &args->in);
        if (r) {
                drm_file_err(uq_mgr->file, "Failed to create Queue\n");
                goto clean_fence_driver;
        }
 
+       amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr);
+
        /* don't map the queue if scheduling is halted */
        if (adev->userq_halt_for_enforce_isolation &&
            ((queue->queue_type == AMDGPU_HW_IP_GFX) ||
@@ -812,7 +812,6 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
                r = amdgpu_userq_map_helper(queue);
                if (r) {
                        drm_file_err(uq_mgr->file, "Failed to map Queue\n");
-                       down_read(&adev->reset_domain->sem);
                        goto clean_mqd;
                }
        }
@@ -828,9 +827,8 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
        if (r) {
                if (!skip_map_queue)
                        amdgpu_userq_unmap_helper(queue);
-
                r = -ENOMEM;
-               goto clean_mqd;
+               goto clean_reset_domain;
        }
 
        r = xa_err(xa_store_irq(&adev->userq_doorbell_xa, index, queue, GFP_KERNEL));
@@ -838,8 +836,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
                xa_erase(&uq_mgr->userq_xa, qid);
                if (!skip_map_queue)
                        amdgpu_userq_unmap_helper(queue);
-
-               goto clean_mqd;
+               goto clean_reset_domain;
        }
        up_read(&adev->reset_domain->sem);
 
@@ -851,12 +848,13 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
        mutex_unlock(&uq_mgr->userq_mutex);
        return 0;
 
+clean_reset_domain:
+       up_read(&adev->reset_domain->sem);
 clean_mqd:
+       mutex_unlock(&uq_mgr->userq_mutex);
        uq_funcs->mqd_destroy(queue);
-       up_read(&adev->reset_domain->sem);
 clean_fence_driver:
        amdgpu_userq_fence_driver_free(queue);
-       mutex_unlock(&uq_mgr->userq_mutex);
 clean_mapping:
        amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
        kfree(queue);