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: 1f7fd484fff1 ("drm/i915: Replace i915_vma_put_fence()")
Signed-off-by: Chris Wilson <[email protected]>
Cc: Matthew Auld <[email protected]>
---
I'm just going to ignore the race with userspace installing a fence
(set-tiling + mmap_gtt) while we pread/pwrite. The answer to that is the
object-lock, which we currently take after we pin. Should be easy enough
to rearrange... Hopefully.
---
 drivers/gpu/drm/i915/i915_gem.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index eb31b69a316a..8bf346c32b8f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1026,6 +1026,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);
-- 
2.23.0

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to