aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-08-07 13:30:54 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-08-08 08:11:15 -0400
commit6d2b888569d366beb4be72cacfde41adee2c25e1 (patch)
treef98f9df52dd9aa42699ce02c39005ebfaf447129 /drivers/gpu/drm/i915/i915_debugfs.c
parenta95fd8cae06dadf4a3eb88c9c130e86c5b0c1723 (diff)
drm/i915: List objects allocated from stolen memory in debugfs
I was curious as to what objects were currently allocated from stolen memory, and so exported it from debugfs. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index a1f4c91fb112..1a87cc9fd899 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -30,6 +30,7 @@
30#include <linux/debugfs.h> 30#include <linux/debugfs.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/export.h> 32#include <linux/export.h>
33#include <linux/list_sort.h>
33#include <drm/drmP.h> 34#include <drm/drmP.h>
34#include "intel_drv.h" 35#include "intel_drv.h"
35#include "intel_ringbuffer.h" 36#include "intel_ringbuffer.h"
@@ -188,6 +189,67 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
188 return 0; 189 return 0;
189} 190}
190 191
192static int obj_rank_by_stolen(void *priv,
193 struct list_head *A, struct list_head *B)
194{
195 struct drm_i915_gem_object *a =
196 container_of(A, struct drm_i915_gem_object, exec_list);
197 struct drm_i915_gem_object *b =
198 container_of(B, struct drm_i915_gem_object, exec_list);
199
200 return a->stolen->start - b->stolen->start;
201}
202
203static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
204{
205 struct drm_info_node *node = (struct drm_info_node *) m->private;
206 struct drm_device *dev = node->minor->dev;
207 struct drm_i915_private *dev_priv = dev->dev_private;
208 struct drm_i915_gem_object *obj;
209 size_t total_obj_size, total_gtt_size;
210 LIST_HEAD(stolen);
211 int count, ret;
212
213 ret = mutex_lock_interruptible(&dev->struct_mutex);
214 if (ret)
215 return ret;
216
217 total_obj_size = total_gtt_size = count = 0;
218 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
219 if (obj->stolen == NULL)
220 continue;
221
222 list_add(&obj->exec_list, &stolen);
223
224 total_obj_size += obj->base.size;
225 total_gtt_size += i915_gem_obj_ggtt_size(obj);
226 count++;
227 }
228 list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
229 if (obj->stolen == NULL)
230 continue;
231
232 list_add(&obj->exec_list, &stolen);
233
234 total_obj_size += obj->base.size;
235 count++;
236 }
237 list_sort(NULL, &stolen, obj_rank_by_stolen);
238 seq_puts(m, "Stolen:\n");
239 while (!list_empty(&stolen)) {
240 obj = list_first_entry(&stolen, typeof(*obj), exec_list);
241 seq_puts(m, " ");
242 describe_obj(m, obj);
243 seq_putc(m, '\n');
244 list_del_init(&obj->exec_list);
245 }
246 mutex_unlock(&dev->struct_mutex);
247
248 seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
249 count, total_obj_size, total_gtt_size);
250 return 0;
251}
252
191#define count_objects(list, member) do { \ 253#define count_objects(list, member) do { \
192 list_for_each_entry(obj, list, member) { \ 254 list_for_each_entry(obj, list, member) { \
193 size += i915_gem_obj_ggtt_size(obj); \ 255 size += i915_gem_obj_ggtt_size(obj); \
@@ -2114,6 +2176,7 @@ static struct drm_info_list i915_debugfs_list[] = {
2114 {"i915_gem_pinned", i915_gem_gtt_info, 0, (void *) PINNED_LIST}, 2176 {"i915_gem_pinned", i915_gem_gtt_info, 0, (void *) PINNED_LIST},
2115 {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, 2177 {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
2116 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 2178 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
2179 {"i915_gem_stolen", i915_gem_stolen_list_info },
2117 {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, 2180 {"i915_gem_pageflip", i915_gem_pageflip_info, 0},
2118 {"i915_gem_request", i915_gem_request_info, 0}, 2181 {"i915_gem_request", i915_gem_request_info, 0},
2119 {"i915_gem_seqno", i915_gem_seqno_info, 0}, 2182 {"i915_gem_seqno", i915_gem_seqno_info, 0},