Commit 7ce596a8 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Take timeline->mutex to walk list-of-requests

Though the context is closed and so no more requests can be added to the
timeline, retirement can still be removing requests. It can even be
removing the very request we are inspecting and so cause us to wander
into dead links.

Serialise with the retirement by taking the timeline->mutex used for
guarding the timeline->requests list.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112404
Fixes: 4a317415 ("drm/i915/gem: Refine occupancy test in kill_context()")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191129151845.1092933-1-chris@chris-wilson.co.uk
parent 8d9875b4
...@@ -403,7 +403,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce) ...@@ -403,7 +403,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce)
if (!ce->timeline) if (!ce->timeline)
return NULL; return NULL;
rcu_read_lock(); mutex_lock(&ce->timeline->mutex);
list_for_each_entry_reverse(rq, &ce->timeline->requests, link) { list_for_each_entry_reverse(rq, &ce->timeline->requests, link) {
if (i915_request_completed(rq)) if (i915_request_completed(rq))
break; break;
...@@ -413,7 +413,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce) ...@@ -413,7 +413,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce)
if (engine) if (engine)
break; break;
} }
rcu_read_unlock(); mutex_unlock(&ce->timeline->mutex);
return engine; return engine;
} }
......
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