Commit ca1543be authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Daniel Vetter

drm/i915: Report correct GGTT space usage

Currently only normal views were accounted which under-accounts
the usage as reported in debugfs.

Introduce new helper, i915_gem_obj_total_ggtt_size, and use it
from call sites which want to know how much GGTT space are
objects using.

v2: Single loop in i915_gem_get_aperture_ioctl. (Chris Wilson)

v3: Walk GGTT active/inactive lists in i915_gem_get_aperture_ioctl
    for better efficiency. (Chris Wilson, Daniel Vetter)

v4: Make i915_gem_obj_total_ggtt_size private to debugfs. (Chris Wilson)

v5: Change unsigned long to u64. (Chris Wilson)
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 4ad2af1e
...@@ -117,6 +117,20 @@ static inline const char *get_global_flag(struct drm_i915_gem_object *obj) ...@@ -117,6 +117,20 @@ static inline const char *get_global_flag(struct drm_i915_gem_object *obj)
return i915_gem_obj_to_ggtt(obj) ? "g" : " "; return i915_gem_obj_to_ggtt(obj) ? "g" : " ";
} }
static u64 i915_gem_obj_total_ggtt_size(struct drm_i915_gem_object *obj)
{
u64 size = 0;
struct i915_vma *vma;
list_for_each_entry(vma, &obj->vma_list, vma_link) {
if (i915_is_ggtt(vma->vm) &&
drm_mm_node_allocated(&vma->node))
size += vma->node.size;
}
return size;
}
static void static void
describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
{ {
...@@ -269,7 +283,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data) ...@@ -269,7 +283,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
list_add(&obj->obj_exec_link, &stolen); list_add(&obj->obj_exec_link, &stolen);
total_obj_size += obj->base.size; total_obj_size += obj->base.size;
total_gtt_size += i915_gem_obj_ggtt_size(obj); total_gtt_size += i915_gem_obj_total_ggtt_size(obj);
count++; count++;
} }
list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) { list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
...@@ -299,7 +313,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data) ...@@ -299,7 +313,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
#define count_objects(list, member) do { \ #define count_objects(list, member) do { \
list_for_each_entry(obj, list, member) { \ list_for_each_entry(obj, list, member) { \
size += i915_gem_obj_ggtt_size(obj); \ size += i915_gem_obj_total_ggtt_size(obj); \
++count; \ ++count; \
if (obj->map_and_fenceable) { \ if (obj->map_and_fenceable) { \
mappable_size += i915_gem_obj_ggtt_size(obj); \ mappable_size += i915_gem_obj_ggtt_size(obj); \
...@@ -405,7 +419,7 @@ static void print_batch_pool_stats(struct seq_file *m, ...@@ -405,7 +419,7 @@ static void print_batch_pool_stats(struct seq_file *m,
#define count_vmas(list, member) do { \ #define count_vmas(list, member) do { \
list_for_each_entry(vma, list, member) { \ list_for_each_entry(vma, list, member) { \
size += i915_gem_obj_ggtt_size(vma->obj); \ size += i915_gem_obj_total_ggtt_size(vma->obj); \
++count; \ ++count; \
if (vma->obj->map_and_fenceable) { \ if (vma->obj->map_and_fenceable) { \
mappable_size += i915_gem_obj_ggtt_size(vma->obj); \ mappable_size += i915_gem_obj_ggtt_size(vma->obj); \
...@@ -535,7 +549,7 @@ static int i915_gem_gtt_info(struct seq_file *m, void *data) ...@@ -535,7 +549,7 @@ static int i915_gem_gtt_info(struct seq_file *m, void *data)
describe_obj(m, obj); describe_obj(m, obj);
seq_putc(m, '\n'); seq_putc(m, '\n');
total_obj_size += obj->base.size; total_obj_size += obj->base.size;
total_gtt_size += i915_gem_obj_ggtt_size(obj); total_gtt_size += i915_gem_obj_total_ggtt_size(obj);
count++; count++;
} }
......
...@@ -149,14 +149,18 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, ...@@ -149,14 +149,18 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_gem_get_aperture *args = data; struct drm_i915_gem_get_aperture *args = data;
struct drm_i915_gem_object *obj; struct i915_gtt *ggtt = &dev_priv->gtt;
struct i915_vma *vma;
size_t pinned; size_t pinned;
pinned = 0; pinned = 0;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) list_for_each_entry(vma, &ggtt->base.active_list, mm_list)
if (i915_gem_obj_is_pinned(obj)) if (vma->pin_count)
pinned += i915_gem_obj_ggtt_size(obj); pinned += vma->node.size;
list_for_each_entry(vma, &ggtt->base.inactive_list, mm_list)
if (vma->pin_count)
pinned += vma->node.size;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
args->aper_size = dev_priv->gtt.base.total; args->aper_size = dev_priv->gtt.base.total;
...@@ -5468,4 +5472,3 @@ bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj) ...@@ -5468,4 +5472,3 @@ bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj)
return false; return false;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment