summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/i915_gem_context.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-07-01 00:05:17 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2017-07-04 11:55:27 +0100
commitfad2083483bb7f743486199f90dc042939323453 (patch)
treee9242564793907441ac200d25b940f7ffd087be2 /drivers/gpu/drm/i915/i915_gem_context.c
parenta874b6a3fb22c8c30f36b1f6ba5430a4c2278a6a (diff)
drm/i915: Fix use-after-free of context during free_contexts
When iterating the list of contexts to free, we need to use a safe iterator as we are freeing the link as we go. Pass an extra thick brown paper bag. Fixes: 5f09a9c8ab6b ("drm/i915: Allow contexts to be unreferenced locklessly") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Matthew Auld <matthew.auld@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170630230517.1938-1-chris@chris-wilson.co.uk Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_context.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 71d2ea7dab64..2eb5d8203999 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -193,11 +193,11 @@ static void i915_gem_context_free(struct i915_gem_context *ctx)
static void contexts_free(struct drm_i915_private *i915)
{
struct llist_node *freed = llist_del_all(&i915->contexts.free_list);
- struct i915_gem_context *ctx;
+ struct i915_gem_context *ctx, *cn;
lockdep_assert_held(&i915->drm.struct_mutex);
- llist_for_each_entry(ctx, freed, free_link)
+ llist_for_each_entry_safe(ctx, cn, freed, free_link)
i915_gem_context_free(ctx);
}