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. Change-Id: Iae6880e7c78b71fde6a6754c69665c2e312a80a5 Signed-off-by: Wentao Lou <Wentao.Lou@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index c4c61e9..5cf21a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -3171,6 +3171,7 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev) struct dma_fence *fence = NULL, *next = NULL; struct amdgpu_bo *shadow; long r = 1, tmo; + bool single_shadow = false; if (amdgpu_sriov_runtime(adev)) tmo = msecs_to_jiffies(8000); @@ -3194,10 +3195,12 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev) r = dma_fence_wait_timeout(fence, false, tmo); dma_fence_put(fence); fence = next; + single_shadow = false; if (r <= 0) break; } else { fence = next; + single_shadow = true; } } mutex_unlock(&adev->shadow_list_lock); @@ -3206,7 +3209,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) { + /* r would be zero even if amdgpu_bo_restore_shadow succeeded when single shadow in list */ + if (r < 0 || (r == 0 && !single_shadow) || tmo <= 0) { DRM_ERROR("recover vram bo from shadow failed\n"); return -EIO; } -- 2.7.4 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx