drm/i915: Print how many objects are shared in per-process stats
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 19 Mar 2014 13:45:46 +0000 (13:45 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 20 Mar 2014 14:09:36 +0000 (15:09 +0100)
The point of this measure is to gauge why a process has a lot of gem
objects in uses and why. Especially for compositors it's interesting
to know whether it's a leak of private objects or just a lot of use
from buffers shared with clients.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
[danvet: Add a bit of commit message flesh to address Ben's comment.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_debugfs.c

index 2bba4c25c53e8ed789f985202cf9fada0744485c..049dcb5256d1e1851dd4f06a568eca36507ec936 100644 (file)
@@ -301,7 +301,9 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
 struct file_stats {
        struct drm_i915_file_private *file_priv;
        int count;
-       size_t total, global, active, inactive, unbound;
+       size_t total, unbound;
+       size_t global, shared;
+       size_t active, inactive;
 };
 
 static int per_file_stats(int id, void *ptr, void *data)
@@ -313,6 +315,9 @@ static int per_file_stats(int id, void *ptr, void *data)
        stats->count++;
        stats->total += obj->base.size;
 
+       if (obj->base.name || obj->base.dma_buf)
+               stats->shared += obj->base.size;
+
        if (USES_FULL_PPGTT(obj->base.dev)) {
                list_for_each_entry(vma, &obj->vma_list, vma_link) {
                        struct i915_hw_ppgtt *ppgtt;
@@ -450,13 +455,14 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                 */
                rcu_read_lock();
                task = pid_task(file->pid, PIDTYPE_PID);
-               seq_printf(m, "%s: %u objects, %zu bytes (%zu active, %zu inactive, %zu global, %zu unbound)\n",
+               seq_printf(m, "%s: %u objects, %zu bytes (%zu active, %zu inactive, %zu global, %zu shared, %zu unbound)\n",
                           task ? task->comm : "<unknown>",
                           stats.count,
                           stats.total,
                           stats.active,
                           stats.inactive,
                           stats.global,
+                          stats.shared,
                           stats.unbound);
                rcu_read_unlock();
        }