drm/i915: Do not record a successful syncpoint for a dma-await
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 3 May 2017 09:39:23 +0000 (10:39 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 3 May 2017 10:08:53 +0000 (11:08 +0100)
As we may unwind the requests, even though the request we are awaiting
has a global_seqno that seqno may be revoked during the await and so we
can not reliably use it as a barrier for all future awaits on the same
timeline.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170503093924.5320-6-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_request.c

index b6246b50e375b3e5eb65b7113788570161a56340..b30d432415d81819fbca8d4b650f5f758b24693c 100644 (file)
@@ -708,33 +708,34 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
        }
 
        seqno = i915_gem_request_global_seqno(from);
-       if (!seqno) {
-               ret = i915_sw_fence_await_dma_fence(&to->submit,
-                                                   &from->fence, 0,
-                                                   GFP_KERNEL);
-               return ret < 0 ? ret : 0;
-       }
+       if (!seqno)
+               goto await_dma_fence;
 
-       if (seqno <= to->timeline->global_sync[from->engine->id])
-               return 0;
-
-       trace_i915_gem_ring_sync_to(to, from);
        if (!i915.semaphores) {
-               if (!i915_spin_request(from, TASK_INTERRUPTIBLE, 2)) {
-                       ret = i915_sw_fence_await_dma_fence(&to->submit,
-                                                           &from->fence, 0,
-                                                           GFP_KERNEL);
-                       if (ret < 0)
-                               return ret;
-               }
+               if (!__i915_gem_request_started(from, seqno))
+                       goto await_dma_fence;
+
+               if (!__i915_spin_request(from, seqno, TASK_INTERRUPTIBLE, 2))
+                       goto await_dma_fence;
        } else {
+               if (seqno <= to->timeline->global_sync[from->engine->id])
+                       return 0;
+
+               trace_i915_gem_ring_sync_to(to, from);
                ret = to->engine->semaphore.sync_to(to, from);
                if (ret)
                        return ret;
+
+               to->timeline->global_sync[from->engine->id] = seqno;
        }
 
-       to->timeline->global_sync[from->engine->id] = seqno;
        return 0;
+
+await_dma_fence:
+       ret = i915_sw_fence_await_dma_fence(&to->submit,
+                                           &from->fence, 0,
+                                           GFP_KERNEL);
+       return ret < 0 ? ret : 0;
 }
 
 int