Commit e8887bb3 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Cancel context if it hangs after it is closed

If we detect a hang in a closed context, just flush all of its requests
and cancel any remaining execution along the context. Note that after
closing the context, the last reference to the context may be dropped,
leaving it only valid under RCU.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191111114323.5833-5-chris@chris-wilson.co.uk
parent dfd9c1b4
...@@ -81,6 +81,11 @@ static bool context_mark_guilty(struct i915_gem_context *ctx) ...@@ -81,6 +81,11 @@ static bool context_mark_guilty(struct i915_gem_context *ctx)
bool banned; bool banned;
int i; int i;
if (i915_gem_context_is_closed(ctx)) {
i915_gem_context_set_banned(ctx);
return true;
}
atomic_inc(&ctx->guilty_count); atomic_inc(&ctx->guilty_count);
/* Cool contexts are too cool to be banned! (Used for reset testing.) */ /* Cool contexts are too cool to be banned! (Used for reset testing.) */
...@@ -128,6 +133,7 @@ void __i915_request_reset(struct i915_request *rq, bool guilty) ...@@ -128,6 +133,7 @@ void __i915_request_reset(struct i915_request *rq, bool guilty)
GEM_BUG_ON(i915_request_completed(rq)); GEM_BUG_ON(i915_request_completed(rq));
rcu_read_lock(); /* protect the GEM context */
if (guilty) { if (guilty) {
i915_request_skip(rq, -EIO); i915_request_skip(rq, -EIO);
if (context_mark_guilty(rq->gem_context)) if (context_mark_guilty(rq->gem_context))
...@@ -136,6 +142,7 @@ void __i915_request_reset(struct i915_request *rq, bool guilty) ...@@ -136,6 +142,7 @@ void __i915_request_reset(struct i915_request *rq, bool guilty)
dma_fence_set_error(&rq->fence, -EAGAIN); dma_fence_set_error(&rq->fence, -EAGAIN);
context_mark_innocent(rq->gem_context); context_mark_innocent(rq->gem_context);
} }
rcu_read_unlock();
} }
static bool i915_in_reset(struct pci_dev *pdev) static bool i915_in_reset(struct pci_dev *pdev)
......
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