drm/i915/contexts: fix list corruption
authorBen Widawsky <ben@bwidawsk.net>
Tue, 14 Aug 2012 21:35:14 +0000 (14:35 -0700)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 17 Aug 2012 07:21:34 +0000 (09:21 +0200)
After reset we unconditionally reinitialize lists. If the context switch
hasn't yet completed before the suspend, the default context object will
end up on lists that are going to go away when we resume.

The patch forces the context switch to be synchronous before suspend
assuring that the active/inactive tracking is correct at the time of
resume.

References: https://bugs.freedesktop.org/show_bug.cgi?id=52429
Tested-by: Guang A Yang <guang.a.yang@intel.com>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem.c

index 5c4657a54f977689c1668a9a70b8a8f6e39743c9..489e2b162b2736b4fc3d43e171ebddb25c66b12e 100644 (file)
@@ -2365,6 +2365,10 @@ int i915_gpu_idle(struct drm_device *dev)
 
        /* Flush everything onto the inactive list. */
        for_each_ring(ring, dev_priv, i) {
+               ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
+               if (ret)
+                       return ret;
+
                ret = i915_ring_idle(ring);
                if (ret)
                        return ret;
@@ -2372,10 +2376,6 @@ int i915_gpu_idle(struct drm_device *dev)
                /* Is the device fubar? */
                if (WARN_ON(!list_empty(&ring->gpu_write_list)))
                        return -EBUSY;
-
-               ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
-               if (ret)
-                       return ret;
        }
 
        return 0;