All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.