[PATCH] drm/amdgpu: fix check oder in amdgpu_bo_move

Daniel Vetter daniel at ffwll.ch
Mon Dec 14 13:35:31 UTC 2020


Christian, can you pls push this to drm-misc-next-fixes? Adding Thomas
as fyi so the pull goes out.
-Daniel

On Mon, Dec 14, 2020 at 2:12 PM Mike Lothian <mike at fireburn.co.uk> wrote:
>
> Tested-by: Mike Lothian <mike at fireburn.co.uk>
>
> Fixes https://gitlab.freedesktop.org/drm/amd/-/issues/1405
>
> Can we make sure this gets into rc1?
>
>
> On Tue, 17 Nov 2020 at 15:02, Nirmoy <nirmodas at amd.com> wrote:
> >
> > Tested-by: Nirmoy Das <nirmoy.das at amd.com
> >
> > Tested on commit 96fb3cbef165db97c999a02efe2287ba4b8c1ceb (HEAD,
> > drm-misc/drm-misc-next)
> >
> >
> >
> > On 11/16/20 8:14 PM, Christian König wrote:
> > > Reorder the code to fix checking if blitting is available.
> > >
> > > Signed-off-by: Christian König <christian.koenig at amd.com>
> > > Fixes: f5a89a5cae81 drm/amdgpu/ttm: use multihop
> > > ---
> > >   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 53 +++++++++++--------------
> > >   1 file changed, 23 insertions(+), 30 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > > index 676fb520e044..c438d290a6db 100644
> > > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > > @@ -551,25 +551,12 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
> > >       struct ttm_resource *old_mem = &bo->mem;
> > >       int r;
> > >
> > > -     if ((old_mem->mem_type == TTM_PL_SYSTEM &&
> > > -          new_mem->mem_type == TTM_PL_VRAM) ||
> > > -         (old_mem->mem_type == TTM_PL_VRAM &&
> > > -          new_mem->mem_type == TTM_PL_SYSTEM)) {
> > > -             hop->fpfn = 0;
> > > -             hop->lpfn = 0;
> > > -             hop->mem_type = TTM_PL_TT;
> > > -             hop->flags = 0;
> > > -             return -EMULTIHOP;
> > > -     }
> > > -
> > >       if (new_mem->mem_type == TTM_PL_TT) {
> > >               r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem);
> > >               if (r)
> > >                       return r;
> > >       }
> > >
> > > -     amdgpu_bo_move_notify(bo, evict, new_mem);
> > > -
> > >       /* Can't move a pinned BO */
> > >       abo = ttm_to_amdgpu_bo(bo);
> > >       if (WARN_ON_ONCE(abo->tbo.pin_count > 0))
> > > @@ -579,24 +566,23 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
> > >
> > >       if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
> > >               ttm_bo_move_null(bo, new_mem);
> > > -             return 0;
> > > +             goto out;
> > >       }
> > >       if (old_mem->mem_type == TTM_PL_SYSTEM &&
> > >           new_mem->mem_type == TTM_PL_TT) {
> > >               ttm_bo_move_null(bo, new_mem);
> > > -             return 0;
> > > +             goto out;
> > >       }
> > > -
> > >       if (old_mem->mem_type == TTM_PL_TT &&
> > >           new_mem->mem_type == TTM_PL_SYSTEM) {
> > >               r = ttm_bo_wait_ctx(bo, ctx);
> > >               if (r)
> > > -                     goto fail;
> > > +                     return r;
> > >
> > >               amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm);
> > >               ttm_resource_free(bo, &bo->mem);
> > >               ttm_bo_assign_mem(bo, new_mem);
> > > -             return 0;
> > > +             goto out;
> > >       }
> > >
> > >       if (old_mem->mem_type == AMDGPU_PL_GDS ||
> > > @@ -607,27 +593,37 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
> > >           new_mem->mem_type == AMDGPU_PL_OA) {
> > >               /* Nothing to save here */
> > >               ttm_bo_move_null(bo, new_mem);
> > > -             return 0;
> > > +             goto out;
> > >       }
> > >
> > > -     if (!adev->mman.buffer_funcs_enabled) {
> > > +     if (adev->mman.buffer_funcs_enabled) {
> > > +             if (((old_mem->mem_type == TTM_PL_SYSTEM &&
> > > +                   new_mem->mem_type == TTM_PL_VRAM) ||
> > > +                  (old_mem->mem_type == TTM_PL_VRAM &&
> > > +                   new_mem->mem_type == TTM_PL_SYSTEM))) {
> > > +                     hop->fpfn = 0;
> > > +                     hop->lpfn = 0;
> > > +                     hop->mem_type = TTM_PL_TT;
> > > +                     hop->flags = 0;
> > > +                     return -EMULTIHOP;
> > > +             }
> > > +
> > > +             r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
> > > +     } else {
> > >               r = -ENODEV;
> > > -             goto memcpy;
> > >       }
> > >
> > > -     r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
> > >       if (r) {
> > > -memcpy:
> > >               /* Check that all memory is CPU accessible */
> > >               if (!amdgpu_mem_visible(adev, old_mem) ||
> > >                   !amdgpu_mem_visible(adev, new_mem)) {
> > >                       pr_err("Move buffer fallback to memcpy unavailable\n");
> > > -                     goto fail;
> > > +                     return r;
> > >               }
> > >
> > >               r = ttm_bo_move_memcpy(bo, ctx, new_mem);
> > >               if (r)
> > > -                     goto fail;
> > > +                     return r;
> > >       }
> > >
> > >       if (bo->type == ttm_bo_type_device &&
> > > @@ -639,14 +635,11 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
> > >               abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> > >       }
> > >
> > > +out:
> > >       /* update statistics */
> > >       atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &adev->num_bytes_moved);
> > > +     amdgpu_bo_move_notify(bo, evict, new_mem);
> > >       return 0;
> > > -fail:
> > > -     swap(*new_mem, bo->mem);
> > > -     amdgpu_bo_move_notify(bo, false, new_mem);
> > > -     swap(*new_mem, bo->mem);
> > > -     return r;
> > >   }
> > >
> > >   /**
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel



-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list