[Intel-gfx] [PATCH 09/19] drm/i915: Change shrink ordering to use locking around unbinding.

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Wed Sep 8 01:04:07 UTC 2021


On Mon, Aug 30, 2021 at 02:09:56PM +0200, Maarten Lankhorst wrote:
>Call drop_pages with the gem object lock held, instead of the other
>way around. This will allow us to drop the vma bindings with the
>gem object lock held.
>
>We plan to require the object lock for unpinning in the future,
>and this is an easy target.
>
>Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>

Looks good to me, we need this for upcoming vm_bind as well.
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>

>---
> drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 42 ++++++++++----------
> 1 file changed, 21 insertions(+), 21 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
>index 5ab136ffdeb2..7f7849b6296d 100644
>--- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
>+++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
>@@ -37,8 +37,8 @@ static bool can_release_pages(struct drm_i915_gem_object *obj)
> 	return swap_available() || obj->mm.madv == I915_MADV_DONTNEED;
> }
>
>-static bool unsafe_drop_pages(struct drm_i915_gem_object *obj,
>-			      unsigned long shrink, bool trylock_vm)
>+static int drop_pages(struct drm_i915_gem_object *obj,
>+		       unsigned long shrink, bool trylock_vm)
> {
> 	unsigned long flags;
>
>@@ -209,27 +209,27 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
>
> 			spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
>
>-			err = 0;
>-			if (unsafe_drop_pages(obj, shrink, trylock_vm)) {
>-				/* May arrive from get_pages on another bo */
>-				if (!ww) {
>-					if (!i915_gem_object_trylock(obj))
>-						goto skip;
>-				} else {
>-					err = i915_gem_object_lock(obj, ww);
>-					if (err)
>-						goto skip;
>-				}
>-
>-				if (!__i915_gem_object_put_pages(obj)) {
>-					try_to_writeback(obj, shrink);
>-					count += obj->base.size >> PAGE_SHIFT;
>-				}
>-				if (!ww)
>-					i915_gem_object_unlock(obj);
>+			/* May arrive from get_pages on another bo */
>+			if (!ww) {
>+				if (!i915_gem_object_trylock(obj))
>+					goto skip;
>+			} else {
>+				err = i915_gem_object_lock(obj, ww);
>+				if (err)
>+					goto skip;
> 			}
>
>-			dma_resv_prune(obj->base.resv);
>+			if (drop_pages(obj, shrink, trylock_vm) &&
>+			    !__i915_gem_object_put_pages(obj)) {
>+				try_to_writeback(obj, shrink);
>+				count += obj->base.size >> PAGE_SHIFT;
>+			}
>+
>+			if (dma_resv_test_signaled(obj->base.resv, true))
>+				dma_resv_add_excl_fence(obj->base.resv, NULL);
>+
>+			if (!ww)
>+				i915_gem_object_unlock(obj);
>
> 			scanned += obj->base.size >> PAGE_SHIFT;
> skip:
>-- 
>2.32.0
>


More information about the Intel-gfx mailing list