Commit 071c92de authored by Mika Kuoppala's avatar Mika Kuoppala Committed by Daniel Vetter

drm/i915: Add process identifier to requests

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: default avatarMika Kuoppala <mika.kuoppala@intel.com>
[danvet: drop NULL check before put_pid as suggested by Chris.]
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 65ca7514
...@@ -2160,6 +2160,9 @@ struct drm_i915_gem_request { ...@@ -2160,6 +2160,9 @@ struct drm_i915_gem_request {
/** file_priv list entry for this request */ /** file_priv list entry for this request */
struct list_head client_list; struct list_head client_list;
/** process identifier submitting this request */
struct pid *pid;
uint32_t uniq; uint32_t uniq;
/** /**
......
...@@ -2493,6 +2493,8 @@ int __i915_add_request(struct intel_engine_cs *ring, ...@@ -2493,6 +2493,8 @@ int __i915_add_request(struct intel_engine_cs *ring,
list_add_tail(&request->client_list, list_add_tail(&request->client_list,
&file_priv->mm.request_list); &file_priv->mm.request_list);
spin_unlock(&file_priv->mm.lock); spin_unlock(&file_priv->mm.lock);
request->pid = get_pid(task_pid(current));
} }
trace_i915_gem_request_add(request); trace_i915_gem_request_add(request);
...@@ -2573,6 +2575,8 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request) ...@@ -2573,6 +2575,8 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request)
list_del(&request->list); list_del(&request->list);
i915_gem_request_remove_from_client(request); i915_gem_request_remove_from_client(request);
put_pid(request->pid);
i915_gem_request_unreference(request); i915_gem_request_unreference(request);
} }
......
...@@ -994,12 +994,11 @@ static void i915_gem_record_rings(struct drm_device *dev, ...@@ -994,12 +994,11 @@ static void i915_gem_record_rings(struct drm_device *dev,
i915_error_ggtt_object_create(dev_priv, i915_error_ggtt_object_create(dev_priv,
ring->scratch.obj); ring->scratch.obj);
if (request->file_priv) { if (request->pid) {
struct task_struct *task; struct task_struct *task;
rcu_read_lock(); rcu_read_lock();
task = pid_task(request->file_priv->file->pid, task = pid_task(request->pid, PIDTYPE_PID);
PIDTYPE_PID);
if (task) { if (task) {
strcpy(error->ring[i].comm, task->comm); strcpy(error->ring[i].comm, task->comm);
error->ring[i].pid = task->pid; error->ring[i].pid = task->pid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment