aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ttm/ttm_bo_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo_util.c')
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_util.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 7cc904d3a4d1..4834c463c38b 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -343,19 +343,25 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
343 if (ret) 343 if (ret)
344 goto out; 344 goto out;
345 345
346 /*
347 * Single TTM move. NOP.
348 */
346 if (old_iomap == NULL && new_iomap == NULL) 349 if (old_iomap == NULL && new_iomap == NULL)
347 goto out2; 350 goto out2;
351
352 /*
353 * Move nonexistent data. NOP.
354 */
348 if (old_iomap == NULL && ttm == NULL) 355 if (old_iomap == NULL && ttm == NULL)
349 goto out2; 356 goto out2;
350 357
351 if (ttm->state == tt_unpopulated) { 358 /*
359 * TTM might be null for moves within the same region.
360 */
361 if (ttm && ttm->state == tt_unpopulated) {
352 ret = ttm->bdev->driver->ttm_tt_populate(ttm); 362 ret = ttm->bdev->driver->ttm_tt_populate(ttm);
353 if (ret) { 363 if (ret)
354 /* if we fail here don't nuke the mm node
355 * as the bo still owns it */
356 old_copy.mm_node = NULL;
357 goto out1; 364 goto out1;
358 }
359 } 365 }
360 366
361 add = 0; 367 add = 0;
@@ -381,11 +387,8 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
381 prot); 387 prot);
382 } else 388 } else
383 ret = ttm_copy_io_page(new_iomap, old_iomap, page); 389 ret = ttm_copy_io_page(new_iomap, old_iomap, page);
384 if (ret) { 390 if (ret)
385 /* failing here, means keep old copy as-is */
386 old_copy.mm_node = NULL;
387 goto out1; 391 goto out1;
388 }
389 } 392 }
390 mb(); 393 mb();
391out2: 394out2:
@@ -403,7 +406,12 @@ out1:
403 ttm_mem_reg_iounmap(bdev, old_mem, new_iomap); 406 ttm_mem_reg_iounmap(bdev, old_mem, new_iomap);
404out: 407out:
405 ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap); 408 ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap);
406 ttm_bo_mem_put(bo, &old_copy); 409
410 /*
411 * On error, keep the mm node!
412 */
413 if (!ret)
414 ttm_bo_mem_put(bo, &old_copy);
407 return ret; 415 return ret;
408} 416}
409EXPORT_SYMBOL(ttm_bo_move_memcpy); 417EXPORT_SYMBOL(ttm_bo_move_memcpy);