drm/i915: Move the irq_barrier for reset earlier into reset_prepare
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Feb 2017 18:52:14 +0000 (18:52 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Feb 2017 21:10:51 +0000 (21:10 +0000)
When updating the bookkeeping following the reset, we need the seqno to
be coherent on the CPU prior to trusting its result for deciding whether
any request is completed. We need the irq_barrier before we start making
these decisions, i.e. in reset_prepare.

References: https://bugs.freedesktop.org/show_bug.cgi?id=99733
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170210185214.23463-1-chris@chris-wilson.co.uk
Reviewed-by: Michel Thierry <michel.thierry@intel.com>
drivers/gpu/drm/i915/i915_gem.c

index 303c079b75e83d1b6fe68eb0e284aa7b6bc48a54..b8d869d7937d4713e6ad94d9940cf8a21f37a91e 100644 (file)
@@ -2652,6 +2652,9 @@ int i915_gem_reset_prepare(struct drm_i915_private *dev_priv)
                tasklet_disable(&engine->irq_tasklet);
                tasklet_kill(&engine->irq_tasklet);
 
+               if (engine->irq_seqno_barrier)
+                       engine->irq_seqno_barrier(engine);
+
                if (engine_stalled(engine)) {
                        request = i915_gem_find_active_request(engine);
                        if (request && request->fence.error == -EIO)
@@ -2748,9 +2751,6 @@ static void i915_gem_reset_engine(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *request;
 
-       if (engine->irq_seqno_barrier)
-               engine->irq_seqno_barrier(engine);
-
        request = i915_gem_find_active_request(engine);
        if (request && i915_gem_reset_request(request)) {
                DRM_DEBUG_DRIVER("resetting %s to restart from tail of request 0x%x\n",