[3/3] drm/amdgpu: remove amdgpu_cs_try_evict

Submitted by Christian König on Sept. 3, 2019, 9:09 a.m.

Details

Message ID 20190903090904.30747-3-christian.koenig@amd.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Christian König Sept. 3, 2019, 9:09 a.m.
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@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(-)

Patch hide | download patch | download mbox

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);

Comments

Reviewed-by: Chunming Zhou <david1.zhou@amd.com> for series.


-David

在 2019/9/3 17:09, Christian König 写道:
> 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@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);