FAILED: patch "[PATCH] drm/i915/gem: Delay tracking the GEM context until it is" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e7d95527f27a6d9edcffbd74eee38e5cb6b91785 Mon Sep 17 00:00:00 2001
From: Chris Wilson <[email protected]>
Date: Thu, 30 Jul 2020 10:28:56 +0100
Subject: [PATCH] drm/i915/gem: Delay tracking the GEM context until it is
registered
Avoid exposing a partially constructed context by deferring the list_add() from the initial construction to the end of registration. Otherwise, if we peek into the list of contexts from inside debugfs, we may see the partially constructed context and chase down some dangling incomplete pointers.
References: f6e8aa387171 ("drm/i915: Report the number of closed vma held by each context in debugfs")
drivers/gpu/drm/i915/gem/i915_gem_context.c +11 -5
@@ -713,6 +713,7 @@ __create_context(struct drm_i915_private *i915) ctx->i915 = i915; ctx->sched.priority =I915_USER_PRIORITY (I915_PRIORITY_NORMAL );mutex_init (&ctx->mutex); +INIT_LIST_HEAD (&ctx->link);spin_lock_init (&ctx->stale.lock);INIT_LIST_HEAD (&ctx->stale.engines);
@@ -740,10 +741,6 @@ __create_context(struct drm_i915_private *i915)for (i =0 ; i <ARRAY_SIZE (ctx->hang_timestamp); i++) ctx->hang_timestamp[i] = jiffies -CONTEXT_FAST_HANG_JIFFIES ; -spin_lock (&i915->gem.contexts.lock); -list_add_tail (&ctx->link, &i915->gem.contexts.list); -spin_unlock (&i915->gem.contexts.lock); -return ctx; err_free:
@@ -931,6 +928,7 @@ static int gem_context_register(struct i915_gem_context *ctx,struct drm_i915_file_private *fpriv, u32 *id) { + struct drm_i915_private *i915 = ctx->i915;struct i915_address_space *vm;int ret;
@@ -949,8 +947,16 @@ static int gem_context_register(struct i915_gem_context *ctx,/* And finally expose ourselves to userspace via the idr */ ret =xa_alloc (&fpriv->context_xa, id, ctx, xa_limit_32b,GFP_KERNEL );if (ret) -put_pid (fetch_and_zero (&ctx->pid)); + goto err_pid; + +spin_lock (&i915->gem.contexts.lock); +list_add_tail (&ctx->link, &i915->gem.contexts.list); +spin_unlock (&i915->gem.contexts.lock); + +return 0 ; +err_pid: +put_pid (fetch_and_zero (&ctx->pid));return ret; }