aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2017-07-04 04:16:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-07-14 11:06:34 -0400
commitcb2dd1a6b641b015b30e4272198e6035d7777adb (patch)
tree3683a20e1ffbe4f3587cce28b27cd333722cb96e /drivers/gpu/drm/amd/amdgpu
parent41d9a6a728ea34d697dc74bc5fea1b6f6c5fce80 (diff)
drm/amdgpu: Try evicting from CPU visible to invisible VRAM first
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. Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 9bbaffbd5f6a..da8b0e15a30c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -214,7 +214,35 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
214 adev->mman.buffer_funcs_ring && 214 adev->mman.buffer_funcs_ring &&
215 adev->mman.buffer_funcs_ring->ready == false) { 215 adev->mman.buffer_funcs_ring->ready == false) {
216 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 216 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
217 } else if (adev->mc.visible_vram_size < adev->mc.real_vram_size &&
218 !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) {
219 unsigned fpfn = adev->mc.visible_vram_size >> PAGE_SHIFT;
220 struct drm_mm_node *node = bo->mem.mm_node;
221 unsigned long pages_left;
222
223 for (pages_left = bo->mem.num_pages;
224 pages_left;
225 pages_left -= node->size, node++) {
226 if (node->start < fpfn)
227 break;
228 }
229
230 if (!pages_left)
231 goto gtt;
232
233 /* Try evicting to the CPU inaccessible part of VRAM
234 * first, but only set GTT as busy placement, so this
235 * BO will be evicted to GTT rather than causing other
236 * BOs to be evicted from VRAM
237 */
238 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
239 AMDGPU_GEM_DOMAIN_GTT);
240 abo->placements[0].fpfn = fpfn;
241 abo->placements[0].lpfn = 0;
242 abo->placement.busy_placement = &abo->placements[1];
243 abo->placement.num_busy_placement = 1;
217 } else { 244 } else {
245gtt:
218 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); 246 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
219 } 247 }
220 break; 248 break;