On 2017å¹´04æ??21æ?¥ 15:07, Roger.He wrote: > Change-Id: Id925f4e241c4192127880d2017fbf2979aa09fc7 > Signed-off-by: Roger.He <Hongbo.He at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 46 ++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 3d8f227..f882496 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -2468,6 +2468,40 @@ bool amdgpu_need_backup(struct amdgpu_device *adev) > return amdgpu_lockup_timeout > 0 ? true : false; > } > > +static int amdgpu_bo_validate_helper(struct amdgpu_bo *bo) > +{ > + uint32_t domain; > + int r; > + > + if (bo->pin_count) > + return 0; > + > + domain = bo->prefered_domains; > + > +retry: > + amdgpu_ttm_placement_from_domain(bo, domain); > + r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); > + if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) { > + domain = bo->allowed_domains; > + goto retry; > + } > + > + return r; > +} > + > +static int amdgpu_bo_validate(struct amdgpu_bo *bo) > +{ > + int r = amdgpu_bo_validate_helper(bo); > + > + if (r) > + return r; > + > + if (bo->shadow) > + r = amdgpu_bo_validate_helper(bo->shadow); > + > + return r; > +} > + > static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev, > struct amdgpu_ring *ring, > struct amdgpu_bo *bo, > @@ -2485,6 +2519,18 @@ static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev, > domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type); > /* if bo has been evicted, then no need to recover */ > if (domain == AMDGPU_GEM_DOMAIN_VRAM) { > + r = amdgpu_bo_validate(bo); you only need to validate shadow, parent already is checked. Regards, David Zhou > + if (r) { > + DRM_ERROR("bo validate failed!\n"); > + goto err; > + } > + > + r = amdgpu_ttm_bind(&bo->shadow->tbo, &bo->shadow->tbo.mem); > + if (r) { > + DRM_ERROR("%p bind failed\n", bo->shadow); > + goto err; > + } > + > r = amdgpu_bo_restore_from_shadow(adev, ring, bo, > NULL, fence, true); > if (r) {