drm/i915: Create a unique name for the context
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 28 Oct 2016 12:58:54 +0000 (13:58 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 28 Oct 2016 19:53:55 +0000 (20:53 +0100)
This will be used for communicating issues with this context to
userspace, so we want to identify the parent process and the individual
context. Note that the name isn't quite unique, it makes the presumption
of there only being a single device fd per process.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161028125858.23563-31-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_context.c

index 4655227eb9d955b633b5758ee0edb61650326d5d..f8604a09c10191a5359df14735ef3f73dd6b0b58 100644 (file)
@@ -631,17 +631,10 @@ static void print_request(struct seq_file *m,
                          struct drm_i915_gem_request *rq,
                          const char *prefix)
 {
-       struct pid *pid = rq->ctx->pid;
-       struct task_struct *task;
-
-       rcu_read_lock();
-       task = pid ? pid_task(pid, PIDTYPE_PID) : NULL;
-       seq_printf(m, "%s%x [%x:%x] @ %d: %s [%d]\n", prefix,
+       seq_printf(m, "%s%x [%x:%x] @ %d: %s\n", prefix,
                   rq->global_seqno, rq->ctx->hw_id, rq->fence.seqno,
                   jiffies_to_msecs(jiffies - rq->emitted_jiffies),
-                  task ? task->comm : "<unknown>",
-                  task ? task->pid : -1);
-       rcu_read_unlock();
+                  rq->timeline->common->name);
 }
 
 static int i915_gem_request_info(struct seq_file *m, void *data)
index 6bf40276ace6a6def68e4999a9f88ff7d3d789ee..8b987f772d4710e3728a12163a9751d1b6b219cc 100644 (file)
@@ -937,6 +937,7 @@ struct i915_gem_context {
        struct drm_i915_file_private *file_priv;
        struct i915_hw_ppgtt *ppgtt;
        struct pid *pid;
+       const char *name;
 
        struct i915_ctx_hang_stats hang_stats;
 
index a2acb8bb5f344cba85e3357fb23a3a79cb2c6920..d3118db244c448694cdcda3603d2f3ff2ebc4af1 100644 (file)
@@ -158,6 +158,7 @@ void i915_gem_context_free(struct kref *ctx_ref)
                __i915_gem_object_release_unless_active(ce->state->obj);
        }
 
+       kfree(ctx->name);
        put_pid(ctx->pid);
        list_del(&ctx->link);
 
@@ -303,19 +304,28 @@ __create_hw_context(struct drm_device *dev,
        }
 
        /* Default context will never have a file_priv */
-       if (file_priv != NULL) {
+       ret = DEFAULT_CONTEXT_HANDLE;
+       if (file_priv) {
                ret = idr_alloc(&file_priv->context_idr, ctx,
                                DEFAULT_CONTEXT_HANDLE, 0, GFP_KERNEL);
                if (ret < 0)
                        goto err_out;
-       } else
-               ret = DEFAULT_CONTEXT_HANDLE;
+       }
+       ctx->user_handle = ret;
 
        ctx->file_priv = file_priv;
-       if (file_priv)
+       if (file_priv) {
                ctx->pid = get_task_pid(current, PIDTYPE_PID);
+               ctx->name = kasprintf(GFP_KERNEL, "%s[%d]/%x",
+                                     current->comm,
+                                     pid_nr(ctx->pid),
+                                     ctx->user_handle);
+               if (!ctx->name) {
+                       ret = -ENOMEM;
+                       goto err_pid;
+               }
+       }
 
-       ctx->user_handle = ret;
        /* NB: Mark all slices as needing a remap so that when the context first
         * loads it will restore whatever remap state already exists. If there
         * is no remap info, it will be a NOP. */
@@ -329,6 +339,9 @@ __create_hw_context(struct drm_device *dev,
 
        return ctx;
 
+err_pid:
+       put_pid(ctx->pid);
+       idr_remove(&file_priv->context_idr, ctx->user_handle);
 err_out:
        context_close(ctx);
        return ERR_PTR(ret);