[PATCH 3/3] drm/amdgpu: remove amdgpu_cs_try_evict
Kenny Ho
y2kenny at gmail.com
Mon Sep 2 14:07:51 UTC 2019
Hey Christian,
Can you go into details a bit more on the how and why this doesn't
work well anymore? (such as its relationship with per VM BOs?) I am
curious to learn more because I was reading into this chunk of code
earlier. Is this something that the Shrinker API can help with?
Regards,
Kenny
On Mon, Sep 2, 2019 at 6:52 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Trying to evict things from the current working set doesn't work that
> well anymore because of per VM BOs.
>
> Rely on reserving VRAM for page tables to avoid contention.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 -
> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 71 +-------------------------
> 2 files changed, 1 insertion(+), 71 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index a236213f8e8e..d1995156733e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -478,7 +478,6 @@ struct amdgpu_cs_parser {
> uint64_t bytes_moved_vis_threshold;
> uint64_t bytes_moved;
> uint64_t bytes_moved_vis;
> - struct amdgpu_bo_list_entry *evictable;
>
> /* user fence */
> struct amdgpu_bo_list_entry uf_entry;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index fd95b586b590..03182d968d3d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -447,75 +447,12 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
> return r;
> }
>
> -/* Last resort, try to evict something from the current working set */
> -static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,
> - struct amdgpu_bo *validated)
> -{
> - uint32_t domain = validated->allowed_domains;
> - struct ttm_operation_ctx ctx = { true, false };
> - int r;
> -
> - if (!p->evictable)
> - return false;
> -
> - for (;&p->evictable->tv.head != &p->validated;
> - p->evictable = list_prev_entry(p->evictable, tv.head)) {
> -
> - struct amdgpu_bo_list_entry *candidate = p->evictable;
> - struct amdgpu_bo *bo = ttm_to_amdgpu_bo(candidate->tv.bo);
> - struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> - bool update_bytes_moved_vis;
> - uint32_t other;
> -
> - /* If we reached our current BO we can forget it */
> - if (bo == validated)
> - break;
> -
> - /* We can't move pinned BOs here */
> - if (bo->pin_count)
> - continue;
> -
> - other = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
> -
> - /* Check if this BO is in one of the domains we need space for */
> - if (!(other & domain))
> - continue;
> -
> - /* Check if we can move this BO somewhere else */
> - other = bo->allowed_domains & ~domain;
> - if (!other)
> - continue;
> -
> - /* Good we can try to move this BO somewhere else */
> - update_bytes_moved_vis =
> - !amdgpu_gmc_vram_full_visible(&adev->gmc) &&
> - amdgpu_bo_in_cpu_visible_vram(bo);
> - amdgpu_bo_placement_from_domain(bo, other);
> - r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> - p->bytes_moved += ctx.bytes_moved;
> - if (update_bytes_moved_vis)
> - p->bytes_moved_vis += ctx.bytes_moved;
> -
> - if (unlikely(r))
> - break;
> -
> - p->evictable = list_prev_entry(p->evictable, tv.head);
> - list_move(&candidate->tv.head, &p->validated);
> -
> - return true;
> - }
> -
> - return false;
> -}
> -
> static int amdgpu_cs_validate(void *param, struct amdgpu_bo *bo)
> {
> struct amdgpu_cs_parser *p = param;
> int r;
>
> - do {
> - r = amdgpu_cs_bo_validate(p, bo);
> - } while (r == -ENOMEM && amdgpu_cs_try_evict(p, bo));
> + r = amdgpu_cs_bo_validate(p, bo);
> if (r)
> return r;
>
> @@ -554,9 +491,6 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
> binding_userptr = true;
> }
>
> - if (p->evictable == lobj)
> - p->evictable = NULL;
> -
> r = amdgpu_cs_validate(p, bo);
> if (r)
> return r;
> @@ -659,9 +593,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
> &p->bytes_moved_vis_threshold);
> p->bytes_moved = 0;
> p->bytes_moved_vis = 0;
> - p->evictable = list_last_entry(&p->validated,
> - struct amdgpu_bo_list_entry,
> - tv.head);
>
> r = amdgpu_vm_validate_pt_bos(p->adev, &fpriv->vm,
> amdgpu_cs_validate, p);
> --
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list