* [PATCH 1/2] drm/i915: remove writeback hook
@ 2021-12-15 11:07 Matthew Auld
2021-12-15 11:07 ` [PATCH 2/2] drm/i915: clean up shrinker_release_pages Matthew Auld
0 siblings, 1 reply; 5+ messages in thread
From: Matthew Auld @ 2021-12-15 11:07 UTC (permalink / raw)
To: intel-gfx; +Cc: Tvrtko Ursulin, dri-devel
Ditch the writeback hook and drop i915_gem_object_writeback(). We
already support the shrinker_release_pages hook which can just call
shmem_writeback directly.
Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
---
drivers/gpu/drm/i915/gem/i915_gem_object.h | 1 -
.../gpu/drm/i915/gem/i915_gem_object_types.h | 1 -
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 10 ----------
drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 19 ++++++++++++++++++-
drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 12 ------------
5 files changed, 18 insertions(+), 25 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 66f20b803b01..aaf9183e601b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -455,7 +455,6 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
-void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
/**
* i915_gem_object_pin_map - return a contiguous mapping of the entire object
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 f9f7e44099fe..00c844caeabd 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -57,7 +57,6 @@ 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);
- void (*writeback)(struct drm_i915_gem_object *obj);
int (*shrinker_release_pages)(struct drm_i915_gem_object *obj,
bool no_gpu_wait,
bool should_writeback);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index 89b70f5cde7a..820eee5e954e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -168,16 +168,6 @@ int i915_gem_object_truncate(struct drm_i915_gem_object *obj)
return 0;
}
-/* Try to discard unwanted pages */
-void i915_gem_object_writeback(struct drm_i915_gem_object *obj)
-{
- assert_object_held_shared(obj);
- GEM_BUG_ON(i915_gem_object_has_pages(obj));
-
- if (obj->ops->writeback)
- obj->ops->writeback(obj);
-}
-
static void __i915_gem_object_reset_page_iter(struct drm_i915_gem_object *obj)
{
struct radix_tree_iter iter;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index cc9fe258fba7..7fdf4fa10b0e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -331,6 +331,23 @@ 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)
+{
+ switch (obj->mm.madv) {
+ case I915_MADV_DONTNEED:
+ return i915_gem_object_truncate(obj);
+ case __I915_MADV_PURGED:
+ return 0;
+ }
+
+ if (writeback)
+ shmem_writeback(obj);
+
+ return 0;
+}
+
void
__i915_gem_object_release_shmem(struct drm_i915_gem_object *obj,
struct sg_table *pages,
@@ -503,7 +520,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,
- .writeback = shmem_writeback,
+ .shrinker_release_pages = shmem_shrinker_release_pages,
.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 157a9765f483..fd54e05521f6 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
@@ -61,18 +61,6 @@ static int try_to_writeback(struct drm_i915_gem_object *obj, unsigned int flags)
return obj->ops->shrinker_release_pages(obj,
!(flags & I915_SHRINK_ACTIVE),
flags & I915_SHRINK_WRITEBACK);
-
- switch (obj->mm.madv) {
- case I915_MADV_DONTNEED:
- i915_gem_object_truncate(obj);
- return 0;
- case __I915_MADV_PURGED:
- return 0;
- }
-
- if (flags & I915_SHRINK_WRITEBACK)
- i915_gem_object_writeback(obj);
-
return 0;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] drm/i915: clean up shrinker_release_pages
2021-12-15 11:07 [PATCH 1/2] drm/i915: remove writeback hook Matthew Auld
@ 2021-12-15 11:07 ` Matthew Auld
2021-12-15 15:55 ` Tvrtko Ursulin
2022-01-05 10:29 ` [Intel-gfx] " Thomas Hellström (Intel)
0 siblings, 2 replies; 5+ messages in thread
From: Matthew Auld @ 2021-12-15 11:07 UTC (permalink / raw)
To: intel-gfx; +Cc: Tvrtko Ursulin, dri-devel
Add some proper flags for the different modes, and shorten the name to
something more snappy.
Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Matthew Auld <matthew.auld@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,
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drm/i915: clean up shrinker_release_pages
2021-12-15 11:07 ` [PATCH 2/2] drm/i915: clean up shrinker_release_pages Matthew Auld
@ 2021-12-15 15:55 ` Tvrtko Ursulin
2021-12-15 16:08 ` Matthew Auld
2022-01-05 10:29 ` [Intel-gfx] " Thomas Hellström (Intel)
1 sibling, 1 reply; 5+ messages in thread
From: Tvrtko Ursulin @ 2021-12-15 15:55 UTC (permalink / raw)
To: Matthew Auld, intel-gfx; +Cc: dri-devel
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@linux.intel.com>
> Signed-off-by: Matthew Auld <matthew.auld@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,
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drm/i915: clean up shrinker_release_pages
2021-12-15 15:55 ` Tvrtko Ursulin
@ 2021-12-15 16:08 ` Matthew Auld
0 siblings, 0 replies; 5+ messages in thread
From: Matthew Auld @ 2021-12-15 16:08 UTC (permalink / raw)
To: Tvrtko Ursulin, intel-gfx, Thomas Hellström; +Cc: dri-devel
On 15/12/2021 15:55, Tvrtko Ursulin wrote:
>
> 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.
Yes, I do see both patches as an improvement :)
>
>> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>> Signed-off-by: Matthew Auld <matthew.auld@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,
>>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Intel-gfx] [PATCH 2/2] drm/i915: clean up shrinker_release_pages
2021-12-15 11:07 ` [PATCH 2/2] drm/i915: clean up shrinker_release_pages Matthew Auld
2021-12-15 15:55 ` Tvrtko Ursulin
@ 2022-01-05 10:29 ` Thomas Hellström (Intel)
1 sibling, 0 replies; 5+ messages in thread
From: Thomas Hellström (Intel) @ 2022-01-05 10:29 UTC (permalink / raw)
To: Matthew Auld, intel-gfx; +Cc: dri-devel
Hi, Matthew
On 12/15/21 12:07, Matthew Auld wrote:
> Add some proper flags for the different modes, and shorten the name to
> something more snappy.
>
> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
LGTM.
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-01-05 10:29 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-15 11:07 [PATCH 1/2] drm/i915: remove writeback hook Matthew Auld
2021-12-15 11:07 ` [PATCH 2/2] drm/i915: clean up shrinker_release_pages Matthew Auld
2021-12-15 15:55 ` Tvrtko Ursulin
2021-12-15 16:08 ` Matthew Auld
2022-01-05 10:29 ` [Intel-gfx] " Thomas Hellström (Intel)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).