drm/i915: Assume exclusive access to objects inside resume
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 19 Aug 2019 20:07:05 +0000 (21:07 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 19 Aug 2019 21:44:00 +0000 (22:44 +0100)
Inside gtt_restore_mappings() we currently take the obj->resv->lock, but
in the future we need to avoid taking this fs-reclaim tainted lock as we
need to extend the coverage of the vm->mutex. Take advantage of the
single-threaded nature of the early resume phase, and do a single
wbinvd() to flush all the GTT objects en masse.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190819200705.3631-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c

index 5413c2ff51a2ca8ca6ed3e35e73257fc020b6e13..e48df11a19fbbd4dc9da91a0117c94013125bf0b 100644 (file)
@@ -3274,6 +3274,7 @@ void i915_ggtt_disable_guc(struct i915_ggtt *ggtt)
 static void ggtt_restore_mappings(struct i915_ggtt *ggtt)
 {
        struct i915_vma *vma, *vn;
+       bool flush = false;
 
        intel_gt_check_and_clear_faults(ggtt->vm.gt);
 
@@ -3298,10 +3299,9 @@ static void ggtt_restore_mappings(struct i915_ggtt *ggtt)
                WARN_ON(i915_vma_bind(vma,
                                      obj ? obj->cache_level : 0,
                                      PIN_UPDATE));
-               if (obj) {
-                       i915_gem_object_lock(obj);
-                       WARN_ON(i915_gem_object_set_to_gtt_domain(obj, false));
-                       i915_gem_object_unlock(obj);
+               if (obj) { /* only used during resume => exclusive access */
+                       flush |= fetch_and_zero(&obj->write_domain);
+                       obj->read_domains |= I915_GEM_DOMAIN_GTT;
                }
 
 lock:
@@ -3312,6 +3312,9 @@ lock:
        ggtt->invalidate(ggtt);
 
        mutex_unlock(&ggtt->vm.mutex);
+
+       if (flush)
+               wbinvd_on_all_cpus();
 }
 
 void i915_gem_restore_gtt_mappings(struct drm_i915_private *i915)