[PATCH 3/6] drm/amdgpu: screen freeze and userq driver crash
Christian König
christian.koenig at amd.com
Wed Sep 11 08:38:18 UTC 2024
Am 11.09.24 um 07:00 schrieb Paneer Selvam, Arunpravin:
> Hi Christian,
>
> On 9/5/2024 4:50 PM, Christian König wrote:
>> Am 30.08.24 um 20:43 schrieb Arunpravin Paneer Selvam:
>>> Screen freeze and userq fence driver crash while playing Xonotic
>>>
>>> Signed-off-by: Arunpravin Paneer Selvam
>>> <Arunpravin.PaneerSelvam at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 12 +++++++-----
>>> 1 file changed, 7 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
>>> index d2e1d0d0f29f..8a3b5374cc1a 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
>>> @@ -187,6 +187,7 @@ int amdgpu_userq_fence_create(struct
>>> amdgpu_usermode_queue *userq,
>>> struct amdgpu_userq_fence_driver *fence_drv;
>>> struct amdgpu_userq_fence *userq_fence;
>>> struct dma_fence *fence;
>>> + unsigned long flags;
>>> fence_drv = userq->fence_drv;
>>> if (!fence_drv)
>>> @@ -230,14 +231,15 @@ int amdgpu_userq_fence_create(struct
>>> amdgpu_usermode_queue *userq,
>>> }
>>> }
>>> - spin_lock(&fence_drv->fence_list_lock);
>>> /* Check if hardware has already processed the job */
>>> - if (!dma_fence_is_signaled(fence))
>>> + if (!dma_fence_is_signaled(fence)) {
>>> + spin_lock_irqsave(&fence_drv->fence_list_lock, flags);
>>
>> As far as I can see that still won't work correctly since you can't
>> guarantee that the fence doesn't signal in between testing and
>> grabbing the lock.
> Can I move the spin lock little up before the if .. else check.
Maybe, I need to see the full code to judge.
But keep in mind that you need to use dma_fence_is_signaled_locked() then.
Regards,
Christian.
>
> Thanks,
> Arun.
>>
>> Christian.
>>
>>
>>
>>> list_add_tail(&userq_fence->link, &fence_drv->fences);
>>> - else
>>> - dma_fence_put(fence);
>>> - spin_unlock(&fence_drv->fence_list_lock);
>>> + spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags);
>>> + } else {
>>> + dma_fence_put(fence);
>>> + }
>>> *f = fence;
>>
>
More information about the amd-gfx
mailing list