Am 06.07.2017 um 12:51 schrieb Michel Dänzer: > From: Michel Dänzer <michel.daenzer at amd.com> > > This gives BOs which haven't been accessed by the CPU since they were > moved to visible VRAM another chance to stay in VRAM when another BO > needs to go to visible VRAM. > > This should allow BOs to stay in VRAM longer in some cases. > > v2: > * Only do this for BOs which don't have the > AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED flag set. > > 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_ttm.c | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > index 58576375b91c..2a9906dd7637 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > @@ -207,7 +207,35 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo, > adev->mman.buffer_funcs_ring && > adev->mman.buffer_funcs_ring->ready == false) { > amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); > + } else if (adev->mc.visible_vram_size < adev->mc.real_vram_size && > + !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) { > + unsigned fpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; > + struct drm_mm_node *node = bo->mem.mm_node; > + unsigned long pages_left; > + > + for (pages_left = bo->mem.num_pages; > + pages_left; > + pages_left -= node->size, node++) { > + if (node->start < fpfn) > + break; > + } > + > + if (!pages_left) > + goto gtt; > + > + /* Try evicting to the CPU inaccessible part of VRAM > + * first, but only set GTT as busy placement, so this > + * BO will be evicted to GTT rather than causing other > + * BOs to be evicted from VRAM > + */ > + amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM | > + AMDGPU_GEM_DOMAIN_GTT); > + abo->placements[0].fpfn = fpfn; > + abo->placements[0].lpfn = 0; > + abo->placement.busy_placement = &abo->placements[1]; > + abo->placement.num_busy_placement = 1; > } else { > +gtt: > amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); > for (i = 0; i < abo->placement.num_placement; ++i) { > if (!(abo->placements[i].flags &