Am 06.07.2017 um 12:51 schrieb Michel Dänzer: > From: John Brooks <john at fastquake.com> > > There is no need for page faults to force BOs into visible VRAM if it's > full, and the time it takes to do so is great enough to cause noticeable > stuttering. Add GTT as a possible placement so that if visible VRAM is > full, page faults move BOs to GTT instead of evicting other BOs from VRAM. > > Suggested-by: Michel Dänzer <michel.daenzer at amd.com> > Signed-off-by: John Brooks <john at fastquake.com> > Reviewed-by: Michel Dänzer <michel.daenzer at amd.com> > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Reviewed-by: Christian König <christian.koenig at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 17 ++++++++++------- > 1 file changed, 10 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > index 93601fbea695..6e24339ecc46 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > @@ -974,18 +974,21 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) > > /* hurrah the memory is not visible ! */ > atomic64_inc(&adev->num_vram_cpu_page_faults); > - amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM); > + amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM | > + AMDGPU_GEM_DOMAIN_GTT); > + > + /* Avoid costly evictions; only set GTT as a busy placement */ > + abo->placement.num_busy_placement = 1; > + abo->placement.busy_placement = &abo->placements[1]; > + > r = ttm_bo_validate(bo, &abo->placement, false, false); > - if (unlikely(r == -ENOMEM)) { > - amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); > - return ttm_bo_validate(bo, &abo->placement, false, false); > - } else if (unlikely(r != 0)) { > + if (unlikely(r != 0)) > return r; > - } > > offset = bo->mem.start << PAGE_SHIFT; > /* this should never happen */ > - if ((offset + size) > adev->mc.visible_vram_size) > + if (bo->mem.mem_type == TTM_PL_VRAM && > + (offset + size) > adev->mc.visible_vram_size) > return -EINVAL; > > return 0;