From: Dave Airlie <airl...@redhat.com>

Don't use explicit move notify for moves just do it in the driver side.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c | 62 ++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 1e6c2561d692..144b82db16ac 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -970,38 +970,42 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool 
evict,
 }
 
 static void
-nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, bool evict,
-                    struct ttm_resource *new_reg)
+nouveau_bo_vma_map_update(struct nouveau_bo *nvbo,
+                         uint32_t mem_type,
+                         struct nouveau_mem *mem)
 {
-       struct nouveau_mem *mem = new_reg ? nouveau_mem(new_reg) : NULL;
-       struct nouveau_bo *nvbo = nouveau_bo(bo);
        struct nouveau_vma *vma;
 
-       /* ttm can now (stupidly) pass the driver bos it didn't create... */
-       if (bo->destroy != nouveau_bo_del_ttm)
-               return;
-
-       nouveau_bo_del_io_reserve_lru(bo);
-
-       if (mem && new_reg->mem_type != TTM_PL_SYSTEM &&
+       if (mem && mem_type != TTM_PL_SYSTEM &&
            mem->mem.page == nvbo->page) {
                list_for_each_entry(vma, &nvbo->vma_list, head) {
                        nouveau_vma_map(vma, mem);
                }
        } else {
                list_for_each_entry(vma, &nvbo->vma_list, head) {
-                       WARN_ON(ttm_bo_wait(bo, false, false));
+                       WARN_ON(ttm_bo_wait(&nvbo->bo, false, false));
                        nouveau_vma_unmap(vma);
                }
        }
+}
 
-       if (new_reg) {
-               if (new_reg->mm_node)
-                       nvbo->offset = (new_reg->start << PAGE_SHIFT);
-               else
-                       nvbo->offset = 0;
-       }
+static void
+nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, bool evict,
+                    struct ttm_resource *new_reg)
+{
+       struct nouveau_bo *nvbo = nouveau_bo(bo);
+
+       /* ttm can now (stupidly) pass the driver bos it didn't create... */
+       if (bo->destroy != nouveau_bo_del_ttm)
+               return;
+
+       /* handle new_reg path in move */
+       if (new_reg)
+               return;
+
+       nouveau_bo_del_io_reserve_lru(bo);
 
+       nouveau_bo_vma_map_update(nvbo, 0, NULL);
 }
 
 static int
@@ -1038,6 +1042,20 @@ nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
        *old_tile = new_tile;
 }
 
+
+static void
+nouveau_bo_update_mem(struct nouveau_bo *nvbo,
+                     struct ttm_resource *new_reg)
+{
+       nouveau_bo_vma_map_update(nvbo, new_reg->mem_type, 
nouveau_mem(new_reg));
+       if (new_reg) {
+               if (new_reg->mm_node)
+                       nvbo->offset = (new_reg->start << PAGE_SHIFT);
+               else
+                       nvbo->offset = 0;
+       }
+}
+
 static int
 nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
                struct ttm_operation_ctx *ctx,
@@ -1053,6 +1071,9 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
        if (ret)
                return ret;
 
+       nouveau_bo_del_io_reserve_lru(bo);
+       nouveau_bo_update_mem(nvbo, new_reg);
+
        if (nvbo->bo.pin_count)
                NV_WARN(drm, "Moving pinned object %p!\n", nvbo);
 
@@ -1108,6 +1129,11 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
                        nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile);
        }
 
+       if (ret) {
+               nouveau_bo_del_io_reserve_lru(bo);
+               nouveau_bo_update_mem(nvbo, &bo->mem);
+       }
+
        return ret;
 }
 
-- 
2.27.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to