]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/i915/gem: Take timeline->mutex to walk list-of-requests
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 29 Nov 2019 15:18:45 +0000 (15:18 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 29 Nov 2019 20:09:14 +0000 (20:09 +0000)
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 <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: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191129151845.1092933-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_context.c

index a179e170c9362d54e62973806bb75d59c04d5056..9f1dc96b10a673e761017b364597acc51d5b69d7 100644 (file)
@@ -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;
 }