* [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create
@ 2026-04-08 5:36 Sunil Khatri
2026-04-08 5:36 ` [PATCH V1 2/2] drm/amdgpu/userq: clean the VA mapping list for failed queue creation Sunil Khatri
2026-04-08 8:23 ` [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Christian König
0 siblings, 2 replies; 5+ messages in thread
From: Sunil Khatri @ 2026-04-08 5:36 UTC (permalink / raw)
To: Alex Deucher, Christian König; +Cc: amd-gfx, Sunil Khatri
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 <sunil.khatri@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 33 +++++++++++------------
1 file changed, 15 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 3a6e7a569c78..3f502c18879a 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);
@@ -781,12 +770,21 @@ 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);
+
/* Convert relative doorbell offset into absolute doorbell index */
index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp);
if (index == (uint64_t)-EINVAL) {
drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n");
r = -EINVAL;
- goto free_queue;
+ goto unlock;
}
queue->doorbell_index = index;
@@ -794,7 +792,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
if (r) {
drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
- goto free_queue;
+ goto unlock;
}
r = uq_funcs->mqd_create(queue, &args->in);
@@ -858,11 +856,10 @@ 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);
-free_queue:
- kfree(queue);
unlock:
mutex_unlock(&uq_mgr->userq_mutex);
-
+free_queue:
+ kfree(queue);
return r;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V1 2/2] drm/amdgpu/userq: clean the VA mapping list for failed queue creation
2026-04-08 5:36 [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Sunil Khatri
@ 2026-04-08 5:36 ` Sunil Khatri
2026-04-08 8:23 ` [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Christian König
1 sibling, 0 replies; 5+ messages in thread
From: Sunil Khatri @ 2026-04-08 5:36 UTC (permalink / raw)
To: Alex Deucher, Christian König; +Cc: amd-gfx, Sunil Khatri
If the queue creation failed during mapping of the important VA's
like queue_va, rptr_va and wptr_va. These needs to be cleaned
as queue destroy will not be called for such queues as user never
get call to creation failure.
Signed-off-by: Sunil Khatri <sunil.khatri@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 3f502c18879a..c4e92113b557 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -767,7 +767,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
amdgpu_userq_input_va_validate(adev, queue, args->in.rptr_va, AMDGPU_GPU_PAGE_SIZE) ||
amdgpu_userq_input_va_validate(adev, queue, args->in.wptr_va, AMDGPU_GPU_PAGE_SIZE)) {
r = -EINVAL;
- goto free_queue;
+ goto clean_mapping;
}
/*
@@ -858,7 +858,8 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
amdgpu_userq_fence_driver_free(queue);
unlock:
mutex_unlock(&uq_mgr->userq_mutex);
-free_queue:
+clean_mapping:
+ amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
kfree(queue);
return r;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create
2026-04-08 5:36 [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Sunil Khatri
2026-04-08 5:36 ` [PATCH V1 2/2] drm/amdgpu/userq: clean the VA mapping list for failed queue creation Sunil Khatri
@ 2026-04-08 8:23 ` Christian König
2026-04-08 8:36 ` Khatri, Sunil
1 sibling, 1 reply; 5+ messages in thread
From: Christian König @ 2026-04-08 8:23 UTC (permalink / raw)
To: Sunil Khatri, Alex Deucher; +Cc: amd-gfx
On 4/8/26 07:36, 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 <sunil.khatri@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 33 +++++++++++------------
> 1 file changed, 15 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index 3a6e7a569c78..3f502c18879a 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);
> @@ -781,12 +770,21 @@ 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);
Even that position is not correct. After grabbing the userq_mutex we can't allocate memory any more.
> +
> /* Convert relative doorbell offset into absolute doorbell index */
> index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp);
> if (index == (uint64_t)-EINVAL) {
> drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n");
> r = -EINVAL;
> - goto free_queue;
> + goto unlock;
> }
>
> queue->doorbell_index = index;
> @@ -794,7 +792,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
> r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
So doing that here is also forbidden.
Regards,
Christian.
> if (r) {
> drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
> - goto free_queue;
> + goto unlock;
> }
>
> r = uq_funcs->mqd_create(queue, &args->in);
> @@ -858,11 +856,10 @@ 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);
> -free_queue:
> - kfree(queue);
> unlock:
> mutex_unlock(&uq_mgr->userq_mutex);
> -
> +free_queue:
> + kfree(queue);
> return r;
> }
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create
2026-04-08 8:23 ` [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Christian König
@ 2026-04-08 8:36 ` Khatri, Sunil
2026-04-08 8:53 ` Christian König
0 siblings, 1 reply; 5+ messages in thread
From: Khatri, Sunil @ 2026-04-08 8:36 UTC (permalink / raw)
To: Christian König, Sunil Khatri, Alex Deucher; +Cc: amd-gfx
[-- Attachment #1: Type: text/plain, Size: 3731 bytes --]
On 08-04-2026 01:53 pm, Christian König wrote:
> On 4/8/26 07:36, 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<sunil.khatri@amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 33 +++++++++++------------
>> 1 file changed, 15 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
>> index 3a6e7a569c78..3f502c18879a 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);
>> @@ -781,12 +770,21 @@ 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);
> Even that position is not correct. After grabbing the userq_mutex we can't allocate memory any more.
>
>> +
>> /* Convert relative doorbell offset into absolute doorbell index */
>> index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp);
>> if (index == (uint64_t)-EINVAL) {
>> drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n");
>> r = -EINVAL;
>> - goto free_queue;
>> + goto unlock;
>> }
>>
>> queue->doorbell_index = index;
>> @@ -794,7 +792,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
>> r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
> So doing that here is also forbidden.
If i am not wrong we could move this whole code including
amdgpu_userq_fence_driver_alloc and above out of mutex. Does that sounds
correct ? Regards Sunil khatri
>
> Regards,
> Christian.
>
>> if (r) {
>> drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
>> - goto free_queue;
>> + goto unlock;
>> }
>>
>> r = uq_funcs->mqd_create(queue, &args->in);
>> @@ -858,11 +856,10 @@ 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);
>> -free_queue:
>> - kfree(queue);
>> unlock:
>> mutex_unlock(&uq_mgr->userq_mutex);
>> -
>> +free_queue:
>> + kfree(queue);
>> return r;
>> }
>>
[-- Attachment #2: Type: text/html, Size: 4636 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create
2026-04-08 8:36 ` Khatri, Sunil
@ 2026-04-08 8:53 ` Christian König
0 siblings, 0 replies; 5+ messages in thread
From: Christian König @ 2026-04-08 8:53 UTC (permalink / raw)
To: Khatri, Sunil, Sunil Khatri, Alex Deucher; +Cc: amd-gfx
On 4/8/26 10:36, Khatri, Sunil wrote:
>
> On 08-04-2026 01:53 pm, Christian König wrote:
>> On 4/8/26 07:36, 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 <sunil.khatri@amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 33 +++++++++++------------
>>> 1 file changed, 15 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
>>> index 3a6e7a569c78..3f502c18879a 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);
>>> @@ -781,12 +770,21 @@ 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);
>> Even that position is not correct. After grabbing the userq_mutex we can't allocate memory any more.
>>
>>> +
>>> /* Convert relative doorbell offset into absolute doorbell index */
>>> index = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp);
>>> if (index == (uint64_t)-EINVAL) {
>>> drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n");
>>> r = -EINVAL;
>>> - goto free_queue;
>>> + goto unlock;
>>> }
>>>
>>> queue->doorbell_index = index;
>>> @@ -794,7 +792,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
>>> r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
>> So doing that here is also forbidden.
> If i am not wrong we could move this whole code including amdgpu_userq_fence_driver_alloc and above out of mutex. Does that sounds correct ?
At least of hand, yes. We only need to hold the mutex when finally talking to the HW to enable the new queue.
Regards,
Christian.
Regards Sunil khatri
>> Regards,
>> Christian.
>>
>>> if (r) {
>>> drm_file_err(uq_mgr->file, "Failed to alloc fence driver\n");
>>> - goto free_queue;
>>> + goto unlock;
>>> }
>>>
>>> r = uq_funcs->mqd_create(queue, &args->in);
>>> @@ -858,11 +856,10 @@ 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);
>>> -free_queue:
>>> - kfree(queue);
>>> unlock:
>>> mutex_unlock(&uq_mgr->userq_mutex);
>>> -
>>> +free_queue:
>>> + kfree(queue);
>>> return r;
>>> }
>>>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-04-08 8:53 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-08 5:36 [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Sunil Khatri
2026-04-08 5:36 ` [PATCH V1 2/2] drm/amdgpu/userq: clean the VA mapping list for failed queue creation Sunil Khatri
2026-04-08 8:23 ` [PATCH V1 1/2] drm/amdgpu/userq: avoid uneccessary locking in amdgpu_userq_create Christian König
2026-04-08 8:36 ` Khatri, Sunil
2026-04-08 8:53 ` Christian König
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.