Commit e4e80625 authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/i915: Change shrink ordering to use locking around unbinding.



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: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211216142749.1966107-3-maarten.lankhorst@linux.intel.com
parent ad5c99e0
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ 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,
static int drop_pages(struct drm_i915_gem_object *obj,
		       unsigned long shrink, bool trylock_vm)
{
	unsigned long flags;
@@ -214,8 +214,6 @@ 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))
@@ -226,13 +224,13 @@ i915_gem_shrink(struct i915_gem_ww_ctx *ww,
					goto skip;
			}

				if (!__i915_gem_object_put_pages(obj)) {
					if (!try_to_writeback(obj, shrink))
			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 (!ww)
				i915_gem_object_unlock(obj);
			}

			scanned += obj->base.size >> PAGE_SHIFT;
skip: