Commit ffa3fe08 authored by Matthew Auld's avatar Matthew Auld
Browse files

drm/i915: clean up shrinker_release_pages



Add some proper flags for the different modes, and shorten the name to
something more snappy.

Suggested-by: default avatarTvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211215110746.865-2-matthew.auld@intel.com
parent 93544177
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -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);
+3 −5
Original line number Diff line number Diff line
@@ -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,
+12 −4
Original line number Diff line number Diff line
@@ -57,10 +57,18 @@ static int 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;
}

+4 −6
Original line number Diff line number Diff line
@@ -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,