summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2012-01-27 13:56:06 -0200
committerEugeni Dodonov <eugeni.dodonov@intel.com>2012-02-01 23:20:27 -0200
commitb48cdbba5a08ac322322704e3ade1f153103f0a0 (patch)
treedcac46dcb9d46e9a742508a538c5d8225e53ef39
parent3d29b842e58fbca2c13a9f458fddbaa535c6e578 (diff)
drm/i915: track pid of caller within each object
This allows to hopefully find out who was responsible for the GPU death, and keep track of which objects were submitted by each process. Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c4
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c3
4 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 6c3be86274e..0225838e52b 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -152,6 +152,8 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
}
if (obj->ring != NULL)
seq_printf(m, " (%s)", obj->ring->name);
+ if (obj->pid)
+ seq_printf(m, " (pid=%u)", obj->pid);
}
static int i915_gem_object_list_info(struct seq_file *m, void *data)
@@ -731,6 +733,8 @@ static void print_error_buffers(struct seq_file *m,
seq_printf(m, " (name: %d)", err->name);
if (err->fence_reg != I915_FENCE_REG_NONE)
seq_printf(m, " (fence: %d)", err->fence_reg);
+ if (err->pid)
+ seq_printf(m, " (pid: %d)", err->pid);
seq_printf(m, "\n");
err++;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f02a5f525f0..0414c812fdd 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -193,6 +193,7 @@ struct drm_i915_error_state {
u32 purgeable:1;
u32 ring:4;
u32 cache_level:2;
+ pid_t pid;
} *active_bo, *pinned_bo;
u32 active_bo_count, pinned_bo_count;
struct intel_overlay_error_state *overlay;
@@ -887,6 +888,9 @@ struct drm_i915_gem_object {
/** for phy allocated objects */
struct drm_i915_gem_phys_object *phys_obj;
+ /** pid of caller process */
+ uint32_t pid;
+
/**
* Number of crtcs where this object is currently the fb, but
* will be page flipped away on the next vblank. When it
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index c01cb201849..7f2d4c6b9e0 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1119,6 +1119,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
INIT_LIST_HEAD(&objects);
for (i = 0; i < args->buffer_count; i++) {
struct drm_i915_gem_object *obj;
+ pid_t pid = file->pid;
obj = to_intel_bo(drm_gem_object_lookup(dev, file,
exec[i].handle));
@@ -1140,6 +1141,9 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
list_add_tail(&obj->exec_list, &objects);
obj->exec_handle = exec[i].handle;
obj->exec_entry = &exec[i];
+
+ obj->pid = pid;
+
eb_add_object(eb, obj);
}
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5d433fc11ac..85281e9de6b 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -791,6 +791,9 @@ static u32 capture_bo_list(struct drm_i915_error_buffer *err,
list_for_each_entry(obj, head, mm_list) {
err->size = obj->base.size;
err->name = obj->base.name;
+
+ err->pid = obj->pid;
+
err->seqno = obj->last_rendering_seqno;
err->gtt_offset = obj->gtt_offset;
err->read_domains = obj->base.read_domains;