diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo_util.c')
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 30 |
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(); |
391 | out2: | 394 | out2: |
@@ -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); |
404 | out: | 407 | out: |
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 | } |
409 | EXPORT_SYMBOL(ttm_bo_move_memcpy); | 417 | EXPORT_SYMBOL(ttm_bo_move_memcpy); |