Commit da95c788 authored by Thomas Hellstrom's avatar Thomas Hellstrom

drm/ttm: Fix ttm_bo_move_memcpy

All error paths will want to keep the mm node, so handle this at the
function exit. This fixes an ioremap failure error path.
Also add some comments to make the function a bit easier to understand.
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarJakob Bornecrantz <jakob@vmware.com>
Cc: stable@vger.kernel.org
parent 9a0599dd
...@@ -343,21 +343,25 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, ...@@ -343,21 +343,25 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
if (ret) if (ret)
goto out; goto out;
/*
* Single TTM move. NOP.
*/
if (old_iomap == NULL && new_iomap == NULL) if (old_iomap == NULL && new_iomap == NULL)
goto out2; goto out2;
/*
* Move nonexistent data. NOP.
*/
if (old_iomap == NULL && ttm == NULL) if (old_iomap == NULL && ttm == NULL)
goto out2; goto out2;
/* TTM might be null for moves within the same region. /*
* TTM might be null for moves within the same region.
*/ */
if (ttm && ttm->state == tt_unpopulated) { if (ttm && ttm->state == tt_unpopulated) {
ret = ttm->bdev->driver->ttm_tt_populate(ttm); ret = ttm->bdev->driver->ttm_tt_populate(ttm);
if (ret) { if (ret)
/* if we fail here don't nuke the mm node
* as the bo still owns it */
old_copy.mm_node = NULL;
goto out1; goto out1;
}
} }
add = 0; add = 0;
...@@ -383,11 +387,8 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, ...@@ -383,11 +387,8 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
prot); prot);
} else } else
ret = ttm_copy_io_page(new_iomap, old_iomap, page); ret = ttm_copy_io_page(new_iomap, old_iomap, page);
if (ret) { if (ret)
/* failing here, means keep old copy as-is */
old_copy.mm_node = NULL;
goto out1; goto out1;
}
} }
mb(); mb();
out2: out2:
...@@ -405,7 +406,12 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, ...@@ -405,7 +406,12 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
ttm_mem_reg_iounmap(bdev, old_mem, new_iomap); ttm_mem_reg_iounmap(bdev, old_mem, new_iomap);
out: out:
ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap); ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap);
ttm_bo_mem_put(bo, &old_copy);
/*
* On error, keep the mm node!
*/
if (!ret)
ttm_bo_mem_put(bo, &old_copy);
return ret; return ret;
} }
EXPORT_SYMBOL(ttm_bo_move_memcpy); EXPORT_SYMBOL(ttm_bo_move_memcpy);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment