Skip to content

Commit

Permalink
drm/i915: Defer application of request banning to submission
Browse files Browse the repository at this point in the history
As we currently do not check on submission whether the context is banned
in a timely manner it is possible for some requests to escape
cancellation after their parent context is banned. By moving the ban
into the request submission under the engine->timeline.lock, we
serialise it with the reset and setting of the context ban.

References: eb8d0f5 ("drm/i915: Remove GPU reset dependence on struct_mutex")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190213182737.12695-1-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
  • Loading branch information
Chris Wilson committed Feb 15, 2019
1 parent c836eb7 commit d9e61b6
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 14 deletions.
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/i915_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,9 @@ void __i915_request_submit(struct i915_request *request)
GEM_BUG_ON(!irqs_disabled());
lockdep_assert_held(&engine->timeline.lock);

if (i915_gem_context_is_banned(request->gem_context))
i915_request_skip(request, -EIO);

GEM_BUG_ON(request->global_seqno);

seqno = next_global_seqno(&engine->timeline);
Expand Down
19 changes: 5 additions & 14 deletions drivers/gpu/drm/i915/i915_reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,15 @@ static void engine_skip_context(struct i915_request *rq)
{
struct intel_engine_cs *engine = rq->engine;
struct i915_gem_context *hung_ctx = rq->gem_context;
struct i915_timeline *timeline = rq->timeline;

lockdep_assert_held(&engine->timeline.lock);
GEM_BUG_ON(timeline == &engine->timeline);

spin_lock(&timeline->lock);

if (i915_request_is_active(rq)) {
list_for_each_entry_continue(rq,
&engine->timeline.requests, link)
if (rq->gem_context == hung_ctx)
i915_request_skip(rq, -EIO);
}

list_for_each_entry(rq, &timeline->requests, link)
i915_request_skip(rq, -EIO);
if (!i915_request_is_active(rq))
return;

spin_unlock(&timeline->lock);
list_for_each_entry_continue(rq, &engine->timeline.requests, link)
if (rq->gem_context == hung_ctx)
i915_request_skip(rq, -EIO);
}

static void client_mark_guilty(struct drm_i915_file_private *file_priv,
Expand Down

0 comments on commit d9e61b6

Please sign in to comment.