| From c735905e0c4430324ff0d981aadcdcf718744cf4 Mon Sep 17 00:00:00 2001 |
| From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> |
| Date: Sun, 24 Jan 2021 15:31:32 +0000 |
| Subject: [PATCH] FROMGIT: drm/i915: Make GEM contexts track DRM clients |
| |
| If we make GEM contexts keep a reference to i915_drm_client for the whole |
| of their lifetime, we can consolidate the current task pid and name usage |
| by getting it from the client. |
| |
| v2: Don't bother supporting selftests contexts from debugfs. (Chris) |
| v3 (Lucas): Finish constructing ctx before adding it to the list |
| v4 (Ram): Rebase on upstream |
| |
| Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Reviewed-by: Aravind Iddamsetty <aravind.iddamsetty@intel.com> |
| Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20210123153733.18139-4-chris@chris-wilson.co.uk |
| Link: https://patchwork.freedesktop.org/patch/msgid/20210124153136.19124-4-chris@chris-wilson.co.uk |
| (cherry picked from commit d8b049b4d60e1e126836df710bb5b91ff07aa2df |
| https://anongit.freedesktop.org/git/drm-intel.git drm-intel-gt-next) |
| |
| BUG=b:179453336 |
| TEST=eDP comes up on brya when built with this commit https://crrev.com/i/3584703 |
| |
| Change-Id: I17d3bbaba9fe527e5cda79adc0244d29197e9840 |
| Signed-off-by: Azhar Shaikh <azhar.shaikh@intel.com> |
| --- |
| drivers/gpu/drm/i915/gem/i915_gem_context.c | 16 ++++++++++---- |
| .../gpu/drm/i915/gem/i915_gem_context_types.h | 13 +++-------- |
| drivers/gpu/drm/i915/i915_gpu_error.c | 22 +++++++++++-------- |
| 3 files changed, 28 insertions(+), 23 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c |
| --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c |
| +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c |
| @@ -987,13 +987,14 @@ void i915_gem_context_release(struct kref *ref) |
| trace_i915_context_free(ctx); |
| GEM_BUG_ON(!i915_gem_context_is_closed(ctx)); |
| |
| + if (ctx->client) |
| + i915_drm_client_put(ctx->client); |
| + |
| if (ctx->syncobj) |
| drm_syncobj_put(ctx->syncobj); |
| |
| mutex_destroy(&ctx->engines_mutex); |
| mutex_destroy(&ctx->lut_mutex); |
| - |
| - put_pid(ctx->pid); |
| mutex_destroy(&ctx->mutex); |
| |
| kfree_rcu(ctx, rcu); |
| @@ -1430,18 +1431,25 @@ static void gem_context_register(struct i915_gem_context *ctx, |
| u32 id) |
| { |
| struct drm_i915_private *i915 = ctx->i915; |
| + struct i915_drm_client *client; |
| void *old; |
| |
| ctx->file_priv = fpriv; |
| |
| - ctx->pid = get_task_pid(current, PIDTYPE_PID); |
| + client = i915_drm_client_get(fpriv->client); |
| + |
| + rcu_read_lock(); |
| snprintf(ctx->name, sizeof(ctx->name), "%s[%d]", |
| - current->comm, pid_nr(ctx->pid)); |
| + i915_drm_client_name(client), |
| + pid_nr(i915_drm_client_pid(client))); |
| + rcu_read_unlock(); |
| |
| /* And finally expose ourselves to userspace via the idr */ |
| old = xa_store(&fpriv->context_xa, id, ctx, GFP_KERNEL); |
| WARN_ON(old); |
| |
| + ctx->client = client; |
| + |
| spin_lock(&i915->gem.contexts.lock); |
| list_add_tail(&ctx->link, &i915->gem.contexts.list); |
| spin_unlock(&i915->gem.contexts.lock); |
| diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h |
| --- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h |
| +++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h |
| @@ -264,19 +264,12 @@ struct i915_gem_context { |
| */ |
| struct i915_address_space __rcu *vm; |
| |
| - /** |
| - * @pid: process id of creator |
| - * |
| - * Note that who created the context may not be the principle user, |
| - * as the context may be shared across a local socket. However, |
| - * that should only affect the default context, all contexts created |
| - * explicitly by the client are expected to be isolated. |
| - */ |
| - struct pid *pid; |
| - |
| /** @link: place with &drm_i915_private.context_list */ |
| struct list_head link; |
| |
| + /** client: struct i915_drm_client */ |
| + struct i915_drm_client *client; |
| + |
| /** |
| * @ref: reference count |
| * |
| diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c |
| --- a/drivers/gpu/drm/i915/i915_gpu_error.c |
| +++ b/drivers/gpu/drm/i915/i915_gpu_error.c |
| @@ -1244,7 +1244,9 @@ static void record_request(const struct i915_request *request, |
| |
| ctx = rcu_dereference(request->context->gem_context); |
| if (ctx) |
| - erq->pid = pid_nr(ctx->pid); |
| + erq->pid = I915_SELFTEST_ONLY(!ctx->client) ? |
| + 0 : |
| + pid_nr(i915_drm_client_pid(ctx->client)); |
| } |
| rcu_read_unlock(); |
| } |
| @@ -1265,23 +1267,25 @@ static bool record_context(struct i915_gem_context_coredump *e, |
| const struct i915_request *rq) |
| { |
| struct i915_gem_context *ctx; |
| - struct task_struct *task; |
| bool simulated; |
| |
| rcu_read_lock(); |
| + |
| ctx = rcu_dereference(rq->context->gem_context); |
| if (ctx && !kref_get_unless_zero(&ctx->ref)) |
| ctx = NULL; |
| - rcu_read_unlock(); |
| - if (!ctx) |
| + if (!ctx) { |
| + rcu_read_unlock(); |
| return true; |
| + } |
| |
| - rcu_read_lock(); |
| - task = pid_task(ctx->pid, PIDTYPE_PID); |
| - if (task) { |
| - strcpy(e->comm, task->comm); |
| - e->pid = task->pid; |
| + if (I915_SELFTEST_ONLY(!ctx->client)) { |
| + strcpy(e->comm, "[kernel]"); |
| + } else { |
| + strcpy(e->comm, i915_drm_client_name(ctx->client)); |
| + e->pid = pid_nr(i915_drm_client_pid(ctx->client)); |
| } |
| + |
| rcu_read_unlock(); |
| |
| e->sched_attr = ctx->sched; |
| -- |
| 2.33.0.685.g46640cef36-goog |
| |