If we want to percolate information back from the HW, up through the GEM
context, we need to wait until the intel_context is scheduled out for
the last time. This is handled by the retirement of the intel_context's
barrier, i.e. by listening to the pulse after the notional unpin. So
wait until the intel_context is finally retired before releasing the
engine, so that we can inspect the final context state and pass it on.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_context.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index 2b6dd08de6f1..11d9135cf21a 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -570,23 +570,19 @@ static void engines_idle_release(struct i915_gem_context 
*ctx,
        engines->ctx = i915_gem_context_get(ctx);
 
        for_each_gem_engine(ce, engines, it) {
-               struct dma_fence *fence;
-               int err = 0;
+               int err;
 
                /* serialises with execbuf */
                set_bit(CONTEXT_CLOSED_BIT, &ce->flags);
                if (!intel_context_pin_if_active(ce))
                        continue;
 
-               fence = i915_active_fence_get(&ce->timeline->last_request);
-               if (fence) {
-                       err = i915_sw_fence_await_dma_fence(&engines->fence,
-                                                           fence, 0,
-                                                           GFP_KERNEL);
-                       dma_fence_put(fence);
-               }
+               /* Wait until context is finally scheduled out and retired */
+               err = i915_sw_fence_await_active(&engines->fence,
+                                                &ce->active,
+                                                I915_ACTIVE_AWAIT_BARRIER);
                intel_context_unpin(ce);
-               if (err < 0)
+               if (err)
                        goto kill;
        }
 
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to