Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: fix check order in radeon_bo_move

Reorder the code to fix checking if blitting is available.

Signed-off-by: Christian König <christian.koenig@amd.com>
Fixes: 28a68f828266 ("drm/radeon/ttm: use multihop")
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/403847/

+27 -33
+27 -33
drivers/gpu/drm/radeon/radeon_ttm.c
··· 216 216 struct ttm_resource *old_mem = &bo->mem; 217 217 int r; 218 218 219 - if ((old_mem->mem_type == TTM_PL_SYSTEM && 220 - new_mem->mem_type == TTM_PL_VRAM) || 221 - (old_mem->mem_type == TTM_PL_VRAM && 222 - new_mem->mem_type == TTM_PL_SYSTEM)) { 223 - hop->fpfn = 0; 224 - hop->lpfn = 0; 225 - hop->mem_type = TTM_PL_TT; 226 - hop->flags = 0; 227 - return -EMULTIHOP; 228 - } 229 - 230 219 if (new_mem->mem_type == TTM_PL_TT) { 231 220 r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, new_mem); 232 221 if (r) 233 222 return r; 234 223 } 235 - radeon_bo_move_notify(bo, evict, new_mem); 236 224 237 225 r = ttm_bo_wait_ctx(bo, ctx); 238 226 if (r) 239 - goto fail; 227 + return r; 240 228 241 229 /* Can't move a pinned BO */ 242 230 rbo = container_of(bo, struct radeon_bo, tbo); ··· 234 246 rdev = radeon_get_rdev(bo->bdev); 235 247 if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) { 236 248 ttm_bo_move_null(bo, new_mem); 237 - return 0; 249 + goto out; 238 250 } 239 251 if (old_mem->mem_type == TTM_PL_SYSTEM && 240 252 new_mem->mem_type == TTM_PL_TT) { 241 253 ttm_bo_move_null(bo, new_mem); 242 - return 0; 254 + goto out; 243 255 } 244 256 245 257 if (old_mem->mem_type == TTM_PL_TT && ··· 247 259 radeon_ttm_tt_unbind(bo->bdev, bo->ttm); 248 260 ttm_resource_free(bo, &bo->mem); 249 261 ttm_bo_assign_mem(bo, new_mem); 250 - return 0; 262 + goto out; 251 263 } 252 - if (!rdev->ring[radeon_copy_ring_index(rdev)].ready || 253 - rdev->asic->copy.copy == NULL) { 254 - /* use memcpy */ 255 - goto memcpy; 256 - } 257 - 258 - r = radeon_move_blit(bo, evict, new_mem, old_mem); 259 - if (r) { 260 - memcpy: 261 - r = ttm_bo_move_memcpy(bo, ctx, new_mem); 262 - if (r) { 263 - goto fail; 264 + if (rdev->ring[radeon_copy_ring_index(rdev)].ready && 265 + rdev->asic->copy.copy != NULL) { 266 + if ((old_mem->mem_type == TTM_PL_SYSTEM && 267 + new_mem->mem_type == TTM_PL_VRAM) || 268 + (old_mem->mem_type == TTM_PL_VRAM && 269 + new_mem->mem_type == TTM_PL_SYSTEM)) { 270 + hop->fpfn = 0; 271 + hop->lpfn = 0; 272 + hop->mem_type = TTM_PL_TT; 273 + hop->flags = 0; 274 + return -EMULTIHOP; 264 275 } 276 + 277 + r = radeon_move_blit(bo, evict, new_mem, old_mem); 278 + } else { 279 + r = -ENODEV; 265 280 } 266 281 282 + if (r) { 283 + r = ttm_bo_move_memcpy(bo, ctx, new_mem); 284 + if (r) 285 + return r; 286 + } 287 + 288 + out: 267 289 /* update statistics */ 268 290 atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved); 291 + radeon_bo_move_notify(bo, evict, new_mem); 269 292 return 0; 270 - fail: 271 - swap(*new_mem, bo->mem); 272 - radeon_bo_move_notify(bo, false, new_mem); 273 - swap(*new_mem, bo->mem); 274 - return r; 275 293 } 276 294 277 295 static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)