Reorganise code to avoid holding mutex userq_mutex while
also trying to grab exec lock ww_mutex where its not needed
for function amdgpu_userq_input_va_validate

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

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 3a6e7a569c78..c19d993fe8c3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -737,28 +737,17 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
                return r;
        }
 
-       /*
-        * There could be a situation that we are creating a new queue while
-        * the other queues under this UQ_mgr are suspended. So if there is any
-        * resume work pending, wait for it to get done.
-        *
-        * This will also make sure we have a valid eviction fence ready to be 
used.
-        */
-       amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr);
-
        uq_funcs = adev->userq_funcs[args->in.ip_type];
        if (!uq_funcs) {
                drm_file_err(uq_mgr->file, "Usermode queue is not supported for 
this IP (%u)\n",
                             args->in.ip_type);
-               r = -EINVAL;
-               goto unlock;
+               return -EINVAL;
        }
 
        queue = kzalloc(sizeof(struct amdgpu_usermode_queue), GFP_KERNEL);
        if (!queue) {
                drm_file_err(uq_mgr->file, "Failed to allocate memory for 
queue\n");
-               r = -ENOMEM;
-               goto unlock;
+               return -ENOMEM;
        }
 
        INIT_LIST_HEAD(&queue->userq_va_list);
@@ -797,6 +786,15 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
                goto free_queue;
        }
 
+       /*
+        * There could be a situation that we are creating a new queue while
+        * the other queues under this UQ_mgr are suspended. So if there is any
+        * resume work pending, wait for it to get done.
+        *
+        * This will also make sure we have a valid eviction fence ready to be 
used.
+        */
+       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");
@@ -858,11 +856,9 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
        up_read(&adev->reset_domain->sem);
 clean_fence_driver:
        amdgpu_userq_fence_driver_free(queue);
+       mutex_unlock(&uq_mgr->userq_mutex);
 free_queue:
        kfree(queue);
-unlock:
-       mutex_unlock(&uq_mgr->userq_mutex);
-
        return r;
 }
 
-- 
2.34.1

Reply via email to