drm/i915: Add process identifier to requests
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Thu, 12 Feb 2015 08:26:02 +0000 (10:26 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 13 Feb 2015 22:28:37 +0000 (23:28 +0100)
We use the pid of the process which opened our device when
we track which was the culprit of the gpu hang. But as that
file descriptor might get inherited, we might blame the
wrong process when we record the error state.

Track process identifiers in requests to always find
the correct offender.

v2: Track only user processes (Chris)

Cc: Kenneth Graunke <kenneth@whitecape.org>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
[danvet: drop NULL check before put_pid as suggested by Chris.]
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gpu_error.c

index b37604bbdf1af201d0d42bb9ae36e0a210426ccc..5d8cb458f4f5476fbe6f39acf218fd84e36326fa 100644 (file)
@@ -2160,6 +2160,9 @@ struct drm_i915_gem_request {
        /** file_priv list entry for this request */
        struct list_head client_list;
 
+       /** process identifier submitting this request */
+       struct pid *pid;
+
        uint32_t uniq;
 
        /**
index 323706cefedf8f993fc3c5167e706be5f084a3ce..f28f0dea6c96fda10950aa7980ba2624d6590a9f 100644 (file)
@@ -2493,6 +2493,8 @@ int __i915_add_request(struct intel_engine_cs *ring,
                list_add_tail(&request->client_list,
                              &file_priv->mm.request_list);
                spin_unlock(&file_priv->mm.lock);
+
+               request->pid = get_pid(task_pid(current));
        }
 
        trace_i915_gem_request_add(request);
@@ -2573,6 +2575,8 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request)
        list_del(&request->list);
        i915_gem_request_remove_from_client(request);
 
+       put_pid(request->pid);
+
        i915_gem_request_unreference(request);
 }
 
index 48ddbf44c8629f34eb570a94e3e9d8572ae1511f..a982849a5edda6560a16a648d04327e7be378327 100644 (file)
@@ -994,12 +994,11 @@ static void i915_gem_record_rings(struct drm_device *dev,
                                        i915_error_ggtt_object_create(dev_priv,
                                                             ring->scratch.obj);
 
-                       if (request->file_priv) {
+                       if (request->pid) {
                                struct task_struct *task;
 
                                rcu_read_lock();
-                               task = pid_task(request->file_priv->file->pid,
-                                               PIDTYPE_PID);
+                               task = pid_task(request->pid, PIDTYPE_PID);
                                if (task) {
                                        strcpy(error->ring[i].comm, task->comm);
                                        error->ring[i].pid = task->pid;