drm/radeon: Fall back to evicting BOs with memcpy if necessary.
authorMichel Dänzer <daenzer@vmware.com>
Tue, 28 Jul 2009 10:30:56 +0000 (12:30 +0200)
committerDave Airlie <airlied@redhat.com>
Wed, 29 Jul 2009 05:45:39 +0000 (15:45 +1000)
Otherwise if there's no GTT space we would fail the eviction, leading to
cascaded failure.

Signed-off-by: Michel Dänzer <daenzer@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_ttm.c

index 37e1cbcce3a90a049a0781f35d186e3b45ea0d98..f3469b96208ca3e755215c9cbcd85d98ecbf40f1 100644 (file)
@@ -355,23 +355,26 @@ static int radeon_bo_move(struct ttm_buffer_object *bo,
        if (!rdev->cp.ready) {
                /* use memcpy */
                DRM_ERROR("CP is not ready use memcpy.\n");
-               return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem);
+               goto memcpy;
        }
 
        if (old_mem->mem_type == TTM_PL_VRAM &&
            new_mem->mem_type == TTM_PL_SYSTEM) {
-               return radeon_move_vram_ram(bo, evict, interruptible,
+               r = radeon_move_vram_ram(bo, evict, interruptible,
                                            no_wait, new_mem);
        } else if (old_mem->mem_type == TTM_PL_SYSTEM &&
                   new_mem->mem_type == TTM_PL_VRAM) {
-               return radeon_move_ram_vram(bo, evict, interruptible,
+               r = radeon_move_ram_vram(bo, evict, interruptible,
                                            no_wait, new_mem);
        } else {
                r = radeon_move_blit(bo, evict, no_wait, new_mem, old_mem);
-               if (unlikely(r)) {
-                       return r;
-               }
        }
+
+       if (r) {
+memcpy:
+               r = ttm_bo_move_memcpy(bo, evict, no_wait, new_mem);
+       }
+
        return r;
 }