[Intel-gfx] [PATCH 2/2] drm/i915: clean up shrinker_release_pages

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Dec 15 15:55:09 UTC 2021


On 15/12/2021 11:07, Matthew Auld wrote:
> Add some proper flags for the different modes, and shorten the name to
> something more snappy.

Looks good to me - but since it touches TTM I leave for Thomas to approve.

Regards,

Tvrtko

P.S. I hope writing the patch means you thought it is an improvement as 
well, rather than feeling I was asking for it to be done.

> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> ---
>   .../gpu/drm/i915/gem/i915_gem_object_types.h  | 23 ++++++++++++++++---
>   drivers/gpu/drm/i915/gem/i915_gem_shmem.c     |  8 +++----
>   drivers/gpu/drm/i915/gem/i915_gem_shrinker.c  | 16 +++++++++----
>   drivers/gpu/drm/i915/gem/i915_gem_ttm.c       | 10 ++++----
>   4 files changed, 39 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> index 00c844caeabd..6f446cca4322 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
> @@ -57,9 +57,26 @@ struct drm_i915_gem_object_ops {
>   	void (*put_pages)(struct drm_i915_gem_object *obj,
>   			  struct sg_table *pages);
>   	int (*truncate)(struct drm_i915_gem_object *obj);
> -	int (*shrinker_release_pages)(struct drm_i915_gem_object *obj,
> -				      bool no_gpu_wait,
> -				      bool should_writeback);
> +	/**
> +	 * shrink - Perform further backend specific actions to facilate
> +	 * shrinking.
> +	 * @obj: The gem object
> +	 * @flags: Extra flags to control shrinking behaviour in the backend
> +	 *
> +	 * Possible values for @flags:
> +	 *
> +	 * I915_GEM_OBJECT_SHRINK_WRITEBACK - Try to perform writeback of the
> +	 * backing pages, if supported.
> +	 *
> +	 * I915_GEM_OBJECT_SHRINK_NO_GPU_WAIT - Don't wait for the object to
> +	 * idle.  Active objects can be considered later. The TTM backend for
> +	 * example might have aync migrations going on, which don't use any
> +	 * i915_vma to track the active GTT binding, and hence having an unbound
> +	 * object might not be enough.
> +	 */
> +#define I915_GEM_OBJECT_SHRINK_WRITEBACK   BIT(0)
> +#define I915_GEM_OBJECT_SHRINK_NO_GPU_WAIT BIT(1)
> +	int (*shrink)(struct drm_i915_gem_object *obj, unsigned int flags);
>   
>   	int (*pread)(struct drm_i915_gem_object *obj,
>   		     const struct drm_i915_gem_pread *arg);
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> index 7fdf4fa10b0e..6c57b0a79c8a 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> @@ -331,9 +331,7 @@ shmem_writeback(struct drm_i915_gem_object *obj)
>   	__shmem_writeback(obj->base.size, obj->base.filp->f_mapping);
>   }
>   
> -static int shmem_shrinker_release_pages(struct drm_i915_gem_object *obj,
> -					bool no_gpu_wait,
> -					bool writeback)
> +static int shmem_shrink(struct drm_i915_gem_object *obj, unsigned int flags)
>   {
>   	switch (obj->mm.madv) {
>   	case I915_MADV_DONTNEED:
> @@ -342,7 +340,7 @@ static int shmem_shrinker_release_pages(struct drm_i915_gem_object *obj,
>   		return 0;
>   	}
>   
> -	if (writeback)
> +	if (flags & I915_GEM_OBJECT_SHRINK_WRITEBACK)
>   		shmem_writeback(obj);
>   
>   	return 0;
> @@ -520,7 +518,7 @@ const struct drm_i915_gem_object_ops i915_gem_shmem_ops = {
>   	.get_pages = shmem_get_pages,
>   	.put_pages = shmem_put_pages,
>   	.truncate = shmem_truncate,
> -	.shrinker_release_pages = shmem_shrinker_release_pages,
> +	.shrink = shmem_shrink,
>   
>   	.pwrite = shmem_pwrite,
>   	.pread = shmem_pread,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> index fd54e05521f6..968ca0fdd57b 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> @@ -57,10 +57,18 @@ static bool unsafe_drop_pages(struct drm_i915_gem_object *obj,
>   
>   static int try_to_writeback(struct drm_i915_gem_object *obj, unsigned int flags)
>   {
> -	if (obj->ops->shrinker_release_pages)
> -		return obj->ops->shrinker_release_pages(obj,
> -							!(flags & I915_SHRINK_ACTIVE),
> -							flags & I915_SHRINK_WRITEBACK);
> +	if (obj->ops->shrink) {
> +		unsigned int shrink_flags = 0;
> +
> +		if (!(flags & I915_SHRINK_ACTIVE))
> +			shrink_flags |= I915_GEM_OBJECT_SHRINK_NO_GPU_WAIT;
> +
> +		if (flags & I915_SHRINK_WRITEBACK)
> +			shrink_flags |= I915_GEM_OBJECT_SHRINK_WRITEBACK;
> +
> +		return obj->ops->shrink(obj, shrink_flags);
> +	}
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> index 923cc7ad8d70..21277f3c64e7 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> @@ -424,16 +424,14 @@ int i915_ttm_purge(struct drm_i915_gem_object *obj)
>   	return 0;
>   }
>   
> -static int i915_ttm_shrinker_release_pages(struct drm_i915_gem_object *obj,
> -					   bool no_wait_gpu,
> -					   bool should_writeback)
> +static int i915_ttm_shrink(struct drm_i915_gem_object *obj, unsigned int flags)
>   {
>   	struct ttm_buffer_object *bo = i915_gem_to_ttm(obj);
>   	struct i915_ttm_tt *i915_tt =
>   		container_of(bo->ttm, typeof(*i915_tt), ttm);
>   	struct ttm_operation_ctx ctx = {
>   		.interruptible = true,
> -		.no_wait_gpu = no_wait_gpu,
> +		.no_wait_gpu = flags & I915_GEM_OBJECT_SHRINK_NO_GPU_WAIT,
>   	};
>   	struct ttm_placement place = {};
>   	int ret;
> @@ -467,7 +465,7 @@ static int i915_ttm_shrinker_release_pages(struct drm_i915_gem_object *obj,
>   		return ret;
>   	}
>   
> -	if (should_writeback)
> +	if (flags & I915_GEM_OBJECT_SHRINK_WRITEBACK)
>   		__shmem_writeback(obj->base.size, i915_tt->filp->f_mapping);
>   
>   	return 0;
> @@ -953,7 +951,7 @@ static const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = {
>   	.get_pages = i915_ttm_get_pages,
>   	.put_pages = i915_ttm_put_pages,
>   	.truncate = i915_ttm_purge,
> -	.shrinker_release_pages = i915_ttm_shrinker_release_pages,
> +	.shrink = i915_ttm_shrink,
>   
>   	.adjust_lru = i915_ttm_adjust_lru,
>   	.delayed_free = i915_ttm_delayed_free,
> 


More information about the Intel-gfx mailing list