On Tue, Jun 04, 2013 at 11:18:03PM +0100, Chris Wilson wrote: > By stashing a pointer of who opened the device and keeping a list of > open fd, we can then walk each client and inspect how many objects they > have open. For example, > > i915_gem_objects: > 1102 objects, 613646336 bytes > 663 [662] objects, 468783104 [468750336] bytes in gtt > 37 [37] active objects, 46874624 [46874624] bytes > 626 [625] inactive objects, 421908480 [421875712] bytes > 282 unbound objects, 6512640 bytes > 85 purgeable objects, 6787072 bytes > 28 pinned mappable objects, 3686400 bytes > 40 fault mappable objects, 27783168 bytes > 2145386496 [536870912] gtt total > > Xorg: 43 objects, 32243712 bytes (10223616 active, 16683008 inactive, 4096 unbound) > gnome-shell: 30 objects, 28381184 bytes (0 active, 28336128 inactive, 0 unbound) > xonotic-linux64: 1032 objects, 569933824 bytes (46874624 active, 383545344 inactive, 6508544 unbound) > > v2: Use existing drm->filelist as pointed out by Ben. > > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk> > --- > drivers/gpu/drm/i915/i915_debugfs.c | 43 +++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_dma.c | 2 ++ > drivers/gpu/drm/i915/i915_drv.h | 2 +- > 3 files changed, 46 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 0e7e3c0..9d45552 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -196,6 +196,32 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data) > } \ > } while (0) > > +struct file_stats { > + int count; > + size_t total, active, inactive, unbound; > +}; > + > +static int per_file_stats(int id, void *ptr, void *data) > +{ > + struct drm_i915_gem_object *obj = ptr; > + struct file_stats *stats = data; > + > + stats->count++; > + stats->total += obj->base.size; > + > + if (obj->gtt_space) { > + if (!list_empty(&obj->ring_list)) > + stats->active += obj->base.size; > + else > + stats->inactive += obj->base.size; > + } else { > + if (!list_empty(&obj->global_list)) > + stats->unbound += obj->base.size; > + } > + > + return 0; > +} > + > static int i915_gem_object_info(struct seq_file *m, void* data) > { > struct drm_info_node *node = (struct drm_info_node *) m->private; > @@ -204,6 +230,7 @@ static int i915_gem_object_info(struct seq_file *m, void* data) > u32 count, mappable_count, purgeable_count; > size_t size, mappable_size, purgeable_size; > struct drm_i915_gem_object *obj; > + struct drm_file *file; > int ret; > > ret = mutex_lock_interruptible(&dev->struct_mutex); > @@ -263,6 +290,22 @@ static int i915_gem_object_info(struct seq_file *m, void* data) > dev_priv->gtt.total, > dev_priv->gtt.mappable_end - dev_priv->gtt.start); > > + seq_printf(m, "\n"); > + list_for_each_entry_reverse(file, &dev->filelist, lhead) { > + struct drm_i915_file_private *file_priv = file->driver_priv; > + struct file_stats stats; > + > + memset(&stats, 0, sizeof(stats)); > + idr_for_each(&file->object_idr, per_file_stats, &stats); > + seq_printf(m, "%s: %u objects, %zu bytes (%zu active, %zu inactive, %zu unbound)\n", > + file_priv->task->comm, > + stats.count, > + stats.total, > + stats.active, > + stats.inactive, > + stats.unbound); > + } > + > mutex_unlock(&dev->struct_mutex); > > return 0; > diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c > index ad4c493..e3ac0e6 100644 > --- a/drivers/gpu/drm/i915/i915_dma.c > +++ b/drivers/gpu/drm/i915/i915_dma.c > @@ -1819,6 +1819,8 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file) > > idr_init(&file_priv->context_idr); > > + file_priv->task = current; > + > return 0; > } > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 496cd37..8497dc9 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1068,7 +1068,6 @@ typedef struct drm_i915_private { > struct mutex modeset_restore_lock; > > struct i915_gtt gtt; > - > struct i915_gem_mm mm; > > /* Kernel Modesetting */ This hunk probably doesn't belong here. > @@ -1352,6 +1351,7 @@ struct drm_i915_gem_request { > }; > > struct drm_i915_file_private { > + struct task_struct *task; > struct { > spinlock_t lock; > struct list_head request_list; Reviewed-by: Ben Widawsky <ben at bwidawsk.net> -- Ben Widawsky, Intel Open Source Technology Center