[PATCH] drm/amdgpu: Fix the dead lock issue.

Deng, Emily Emily.Deng at amd.com
Mon Sep 10 07:19:31 UTC 2018


>-----Original Message-----
>From: Christian König <ckoenig.leichtzumerken at gmail.com>
>Sent: Monday, September 10, 2018 3:06 PM
>To: Deng, Emily <Emily.Deng at amd.com>; amd-gfx at lists.freedesktop.org
>Subject: Re: [PATCH] drm/amdgpu: Fix the dead lock issue.
>
>Am 10.09.2018 um 06:07 schrieb Emily Deng:
>> It will ramdomly have the dead lock issue when test TDR:
>> 1. amdgpu_device_handle_vram_lost gets the lock shadow_list_lock 2.
>> amdgpu_bo_create locked the bo's resv lock 3. amdgpu_bo_create_shadow
>> is waiting for the shadow_list_lock 4.
>> amdgpu_device_recover_vram_from_shadow is waiting for the bo's resv
>> lock.
>>
>> Signed-off-by: Emily Deng <Emily.Deng at amd.com>
>
>Good catch, problem is the fix doesn't work like this because the lock won't be
>dropped at this point in most cases.
Sorry, could you explain more, why the lock won't be dropped after calling reservation_object_unlock?
>
>Instead you need to fix amdgpu_device_recover_vram_from_shadow to make
>a local copy of the list.
>
>You can do this by grabbing a reference to each BO and moving it to a local
>list.
>
>Regards,
>Christian.
>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 12 +++++++-----
>>   1 file changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> index de990bd..c75447d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> @@ -557,12 +557,8 @@ static int amdgpu_bo_create_shadow(struct
>amdgpu_device *adev,
>>   	bp.resv = bo->tbo.resv;
>>
>>   	r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
>> -	if (!r) {
>> +	if (!r)
>>   		bo->shadow->parent = amdgpu_bo_ref(bo);
>> -		mutex_lock(&adev->shadow_list_lock);
>> -		list_add_tail(&bo->shadow_list, &adev->shadow_list);
>> -		mutex_unlock(&adev->shadow_list_lock);
>> -	}
>>
>>   	return r;
>>   }
>> @@ -603,6 +599,12 @@ int amdgpu_bo_create(struct amdgpu_device
>*adev,
>>   		if (!bp->resv)
>>   			reservation_object_unlock((*bo_ptr)->tbo.resv);
>>
>> +		if (!r) {
>> +			mutex_lock(&adev->shadow_list_lock);
>> +			list_add_tail(&(*bo_ptr)->shadow_list, &adev-
>>shadow_list);
>> +			mutex_unlock(&adev->shadow_list_lock);
>> +		}
>> +
>>   		if (r)
>>   			amdgpu_bo_unref(bo_ptr);
>>   	}



More information about the amd-gfx mailing list