diff options
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 8369e35c0dce..4834c463c38b 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c | |||
@@ -343,21 +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 | /* TTM might be null for moves within the same region. | 358 | /* |
359 | * TTM might be null for moves within the same region. | ||
352 | */ | 360 | */ |
353 | if (ttm && ttm->state == tt_unpopulated) { | 361 | if (ttm && ttm->state == tt_unpopulated) { |
354 | ret = ttm->bdev->driver->ttm_tt_populate(ttm); | 362 | ret = ttm->bdev->driver->ttm_tt_populate(ttm); |
355 | if (ret) { | 363 | if (ret) |
356 | /* if we fail here don't nuke the mm node | ||
357 | * as the bo still owns it */ | ||
358 | old_copy.mm_node = NULL; | ||
359 | goto out1; | 364 | goto out1; |
360 | } | ||
361 | } | 365 | } |
362 | 366 | ||
363 | add = 0; | 367 | add = 0; |
@@ -383,11 +387,8 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, | |||
383 | prot); | 387 | prot); |
384 | } else | 388 | } else |
385 | ret = ttm_copy_io_page(new_iomap, old_iomap, page); | 389 | ret = ttm_copy_io_page(new_iomap, old_iomap, page); |
386 | if (ret) { | 390 | if (ret) |
387 | /* failing here, means keep old copy as-is */ | ||
388 | old_copy.mm_node = NULL; | ||
389 | goto out1; | 391 | goto out1; |
390 | } | ||
391 | } | 392 | } |
392 | mb(); | 393 | mb(); |
393 | out2: | 394 | out2: |
@@ -405,7 +406,12 @@ out1: | |||
405 | ttm_mem_reg_iounmap(bdev, old_mem, new_iomap); | 406 | ttm_mem_reg_iounmap(bdev, old_mem, new_iomap); |
406 | out: | 407 | out: |
407 | ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap); | 408 | ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap); |
408 | 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); | ||
409 | return ret; | 415 | return ret; |
410 | } | 416 | } |
411 | EXPORT_SYMBOL(ttm_bo_move_memcpy); | 417 | EXPORT_SYMBOL(ttm_bo_move_memcpy); |