Set GTT as the busy placement for newly created BOs that have the AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED flag, so that they don't cause established BOs to be evicted from visible VRAM. Signed-off-by: John Brooks <john at fastquake.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 365883d..655718a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -392,6 +392,17 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev, #endif amdgpu_fill_placement_to_bo(bo, placement); + + /* This is a new BO that wants to be CPU-visible; set GTT as the busy + * placement so that it does not evict established BOs from visible VRAM. + */ + if (domain & (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT) && + flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { + bo->placement.num_placement = 1; + bo->placement.num_busy_placement = 1; + bo->placement.busy_placement = &bo->placement.placement[1]; + } + /* Kernel allocation are uninterruptible */ initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); @@ -484,6 +495,13 @@ int amdgpu_bo_create(struct amdgpu_device *adev, memset(&placements, 0, (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place)); + + /* New CPU-visible BOs will have GTT set as their busy placement */ + if (domain & AMDGPU_GEM_DOMAIN_VRAM && + flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { + domain |= AMDGPU_GEM_DOMAIN_GTT; + } + amdgpu_ttm_placement_init(adev, &placement, placements, domain, flags); -- 2.7.4