drm/i915: Trylock the object when shrinking
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Thu, 16 Dec 2021 14:27:41 +0000 (15:27 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 21 Dec 2021 12:26:33 +0000 (13:26 +0100)
We're working on requiring the obj->resv lock during unbind, fix
the shrinker to take the object lock.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211216142749.1966107-10-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_shrinker.c

index 6003db8..f893f0b 100644 (file)
@@ -405,12 +405,18 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
        list_for_each_entry_safe(vma, next,
                                 &i915->ggtt.vm.bound_list, vm_link) {
                unsigned long count = vma->node.size >> PAGE_SHIFT;
+               struct drm_i915_gem_object *obj = vma->obj;
 
                if (!vma->iomap || i915_vma_is_active(vma))
                        continue;
 
+               if (!i915_gem_object_trylock(obj))
+                       continue;
+
                if (__i915_vma_unbind(vma) == 0)
                        freed_pages += count;
+
+               i915_gem_object_unlock(obj);
        }
        mutex_unlock(&i915->ggtt.vm.mutex);