提交 b6c7488d 编写于 作者: B Ben Widawsky 提交者: Daniel Vetter

drm/i915/contexts: fix list corruption

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=52429Tested-by: NGuang A Yang <guang.a.yang@intel.com>
Signed-off-by: NBen Widawsky <ben@bwidawsk.net>
Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 38ab8a20
...@@ -2365,6 +2365,10 @@ int i915_gpu_idle(struct drm_device *dev) ...@@ -2365,6 +2365,10 @@ int i915_gpu_idle(struct drm_device *dev)
/* Flush everything onto the inactive list. */ /* Flush everything onto the inactive list. */
for_each_ring(ring, dev_priv, i) { 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); ret = i915_ring_idle(ring);
if (ret) if (ret)
return ret; return ret;
...@@ -2372,10 +2376,6 @@ int i915_gpu_idle(struct drm_device *dev) ...@@ -2372,10 +2376,6 @@ int i915_gpu_idle(struct drm_device *dev)
/* Is the device fubar? */ /* Is the device fubar? */
if (WARN_ON(!list_empty(&ring->gpu_write_list))) if (WARN_ON(!list_empty(&ring->gpu_write_list)))
return -EBUSY; return -EBUSY;
ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
if (ret)
return ret;
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册