drm/ttm: Fix ttm_bo_move_memcpy
authorThomas Hellstrom <thellstrom@vmware.com>
Wed, 30 Oct 2013 10:29:50 +0000 (03:29 -0700)
committerThomas Hellstrom <thellstrom@vmware.com>
Wed, 6 Nov 2013 12:36:12 +0000 (04:36 -0800)
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: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Cc: stable@vger.kernel.org
drivers/gpu/drm/ttm/ttm_bo_util.c

index 8369e35c0dce744933331636cdd680b04f66b39f..4834c463c38bdf04d02049f5ca324d152fb6f57d 100644 (file)
@@ -343,21 +343,25 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
        if (ret)
                goto out;
 
+       /*
+        * Single TTM move. NOP.
+        */
        if (old_iomap == NULL && new_iomap == NULL)
                goto out2;
+
+       /*
+        * Move nonexistent data. NOP.
+        */
        if (old_iomap == NULL && ttm == NULL)
                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) {
                ret = ttm->bdev->driver->ttm_tt_populate(ttm);
-               if (ret) {
-                       /* if we fail here don't nuke the mm node
-                        * as the bo still owns it */
-                       old_copy.mm_node = NULL;
+               if (ret)
                        goto out1;
-               }
        }
 
        add = 0;
@@ -383,11 +387,8 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
                                                   prot);
                } else
                        ret = ttm_copy_io_page(new_iomap, old_iomap, page);
-               if (ret) {
-                       /* failing here, means keep old copy as-is */
-                       old_copy.mm_node = NULL;
+               if (ret)
                        goto out1;
-               }
        }
        mb();
 out2:
@@ -405,7 +406,12 @@ out1:
        ttm_mem_reg_iounmap(bdev, old_mem, new_iomap);
 out:
        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;
 }
 EXPORT_SYMBOL(ttm_bo_move_memcpy);