summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-11-11 14:43:23 +0300
committerChris Wilson <chris@chris-wilson.co.uk>2019-11-11 14:46:40 +0300
commite8887bb3eb6f55401e0d0f9ee5739e5baca4a58c (patch)
tree35c7bd9bb6f6b5196bc74e6bf80a085137c84dbf /drivers/gpu/drm/i915
parentdfd9c1b4eab124c16c3b59362c3640983bf79949 (diff)
downloadlinux-e8887bb3eb6f55401e0d0f9ee5739e5baca4a58c.tar.xz
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: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191111114323.5833-5-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/gt/intel_reset.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c
index 86d52383bf9d..b7007cd78c6f 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -81,6 +81,11 @@ static bool context_mark_guilty(struct i915_gem_context *ctx)
bool banned;
int i;
+ if (i915_gem_context_is_closed(ctx)) {
+ i915_gem_context_set_banned(ctx);
+ return true;
+ }
+
atomic_inc(&ctx->guilty_count);
/* 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)
GEM_BUG_ON(i915_request_completed(rq));
+ rcu_read_lock(); /* protect the GEM context */
if (guilty) {
i915_request_skip(rq, -EIO);
if (context_mark_guilty(rq->gem_context))
@@ -136,6 +142,7 @@ void __i915_request_reset(struct i915_request *rq, bool guilty)
dma_fence_set_error(&rq->fence, -EAGAIN);
context_mark_innocent(rq->gem_context);
}
+ rcu_read_unlock();
}
static bool i915_in_reset(struct pci_dev *pdev)