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 <ch...@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/i915_gem_context.c | 23 ++++++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6daa4d538f42..bb2b8b41eb61 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -918,6 +918,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;
 
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index fe45cd7640b3..762f3de9421f 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -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);
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to