On 4/8/26 11:38, Sunil Khatri wrote: > 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]>
Reviewed-by: Christian König <[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; > } >
