[PATCH] amdgpu_device_recover_vram always failed if only one node in shadow_list

Christian König ckoenig.leichtzumerken at gmail.com
Wed Apr 3 07:57:16 UTC 2019


Am 03.04.19 um 08:33 schrieb wentalou:
> amdgpu_bo_restore_shadow would assign zero to r if succeeded.
> r would remain zero if there is only one node in shadow_list.
> current code would always return failure when r <= 0.
> restart the timeout for each wait was a rather problematic bug as well.
> The value of tmo SHOULD be changed, otherwise we wait tmo jiffies on each loop.
>
> Change-Id: I7e836ec7ab6cd0f069aac24f88e454e906637541
> Signed-off-by: Wentao Lou <Wentao.Lou at amd.com>

Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 13 +++++++++----
>   1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index c4c61e9..fcb3d95 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -3191,11 +3191,16 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
>   			break;
>   
>   		if (fence) {
> -			r = dma_fence_wait_timeout(fence, false, tmo);
> +			tmo = dma_fence_wait_timeout(fence, false, tmo);
>   			dma_fence_put(fence);
>   			fence = next;
> -			if (r <= 0)
> +			if (tmo == 0) {
> +				r = -ETIMEDOUT;
>   				break;
> +			} else if (tmo < 0) {
> +				r = tmo;
> +				break;
> +			}
>   		} else {
>   			fence = next;
>   		}
> @@ -3206,8 +3211,8 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
>   		tmo = dma_fence_wait_timeout(fence, false, tmo);
>   	dma_fence_put(fence);
>   
> -	if (r <= 0 || tmo <= 0) {
> -		DRM_ERROR("recover vram bo from shadow failed\n");
> +	if (r < 0 || tmo <= 0) {
> +		DRM_ERROR("recover vram bo from shadow failed, r is %ld, tmo is %ld\n", r, tmo);
>   		return -EIO;
>   	}
>   



More information about the amd-gfx mailing list