[PATCH 18/45] drm/nouveau: handle move notify inside move callback.
Ben Skeggs
skeggsb at gmail.com
Wed Sep 30 05:53:52 UTC 2020
On Thu, 24 Sep 2020 at 15:20, Dave Airlie <airlied at gmail.com> wrote:
>
> From: Dave Airlie <airlied at redhat.com>
>
> Don't use explicit move notify for moves just do it in the driver side.
>
> Signed-off-by: Dave Airlie <airlied at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list