Commit 2d4ecace authored by Chris Wilson's avatar Chris Wilson

drm/i915: Finish the wait-for-wedge by retiring all the inflight requests

Before we reset the GPU after marking the device as wedged, we wait for
all the remaining requests to be completed (and marked as EIO).
Afterwards, we should flush the request lists so the next batch start
with the driver in an idle state.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180307134226.25492-1-chris@chris-wilson.co.uk
parent 1e6aa7e5
...@@ -3281,7 +3281,8 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915) ...@@ -3281,7 +3281,8 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915)
if (!test_bit(I915_WEDGED, &i915->gpu_error.flags)) if (!test_bit(I915_WEDGED, &i915->gpu_error.flags))
return true; return true;
/* Before unwedging, make sure that all pending operations /*
* Before unwedging, make sure that all pending operations
* are flushed and errored out - we may have requests waiting upon * are flushed and errored out - we may have requests waiting upon
* third party fences. We marked all inflight requests as EIO, and * third party fences. We marked all inflight requests as EIO, and
* every execbuf since returned EIO, for consistency we want all * every execbuf since returned EIO, for consistency we want all
...@@ -3299,7 +3300,8 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915) ...@@ -3299,7 +3300,8 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915)
if (!rq) if (!rq)
continue; continue;
/* We can't use our normal waiter as we want to /*
* We can't use our normal waiter as we want to
* avoid recursively trying to handle the current * avoid recursively trying to handle the current
* reset. The basic dma_fence_default_wait() installs * reset. The basic dma_fence_default_wait() installs
* a callback for dma_fence_signal(), which is * a callback for dma_fence_signal(), which is
...@@ -3314,8 +3316,11 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915) ...@@ -3314,8 +3316,11 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915)
return false; return false;
} }
} }
i915_retire_requests(i915);
GEM_BUG_ON(i915->gt.active_requests);
/* Undo nop_submit_request. We prevent all new i915 requests from /*
* Undo nop_submit_request. We prevent all new i915 requests from
* being queued (by disallowing execbuf whilst wedged) so having * being queued (by disallowing execbuf whilst wedged) so having
* waited for all active requests above, we know the system is idle * waited for all active requests above, we know the system is idle
* and do not have to worry about a thread being inside * and do not have to worry about a thread being inside
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment