Message ID | 20200924051845.397177-19-airlied@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | TTM move refactoring | expand |
On Thu, 24 Sep 2020 at 15:20, Dave Airlie <airlied@gmail.com> wrote: > > From: Dave Airlie <airlied@redhat.com> > > Don't use explicit move notify for moves just do it in the driver side. > > Signed-off-by: Dave Airlie <airlied@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)); I can look at this more closely myself a bit down the track, as I need to do a lot in this area in the near future anyway, but it'd be nice to pass the failure back here where possible to do so. The new invalidate_notify() hook still can't fail, but the other uses can and it'd be nice to do the right thing where it's possible. Ben. > 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
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; }