diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-08-07 13:30:54 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-08-08 08:11:15 -0400 |
commit | 6d2b888569d366beb4be72cacfde41adee2c25e1 (patch) | |
tree | f98f9df52dd9aa42699ce02c39005ebfaf447129 /drivers/gpu/drm/i915/i915_debugfs.c | |
parent | a95fd8cae06dadf4a3eb88c9c130e86c5b0c1723 (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.c | 63 |
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 | ||
192 | static 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 | |||
203 | static 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}, |