]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Flush the existing fence before GGTT read/write
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 23 Aug 2019 15:39:44 +0000 (16:39 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 23 Aug 2019 18:44:21 +0000 (19:44 +0100)
Our fence management is lazy, very lazy. If the user marks an object as
untiled, we do not immediately flush the fence but merely mark it as
dirty. On the next use we have to remember to check and remove the fence,
by which time we hope it is idle and we do not have to wait.

v2: Throw away the old fence on the next ggtt_pin.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111468
Fixes: 4ab755538322 ("drm/i915: Replace i915_vma_put_fence()")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190823153944.20630-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index ec9a46c276de41e6222acc769098c43d60ed8a1a..95e7c52cf8edc430e5c77bd866a8db183e29907c 100644 (file)
@@ -1027,6 +1027,14 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
                        return ERR_PTR(ret);
        }
 
+       if (vma->fence && !i915_gem_object_is_tiled(obj)) {
+               mutex_lock(&vma->vm->mutex);
+               ret = i915_vma_revoke_fence(vma);
+               mutex_unlock(&vma->vm->mutex);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
        ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
        if (ret)
                return ERR_PTR(ret);