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: 4a3174152147 ("drm/i915/gem: Refine occupancy test in kill_context()")
Signed-off-by: Chris Wilson <[email protected]>
Cc: Tvrtko Ursulin <[email protected]>
Cc: Mika Kuoppala <[email protected]>
Cc: Matthew Auld <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
---
 drivers/gpu/drm/i915/gem/i915_gem_context.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index a179e170c936..9f1dc96b10a6 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -403,7 +403,7 @@ static struct intel_engine_cs *active_engine(struct 
intel_context *ce)
        if (!ce->timeline)
                return NULL;
 
-       rcu_read_lock();
+       mutex_lock(&ce->timeline->mutex);
        list_for_each_entry_reverse(rq, &ce->timeline->requests, link) {
                if (i915_request_completed(rq))
                        break;
@@ -413,7 +413,7 @@ static struct intel_engine_cs *active_engine(struct 
intel_context *ce)
                if (engine)
                        break;
        }
-       rcu_read_unlock();
+       mutex_unlock(&ce->timeline->mutex);
 
        return engine;
 }
-- 
2.24.0

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to