[PATCH] drm/amdgpu: fix check oder in amdgpu_bo_move
Mike Lothian
mike at fireburn.co.uk
Mon Dec 14 13:12:36 UTC 2020
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
More information about the dri-devel
mailing list