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: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
4ad2af1ed1
commit
ca1543be2c
@ -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" : " ";
|
||||
}
|
||||
|
||||
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
|
||||
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)
|
||||
list_add(&obj->obj_exec_link, &stolen);
|
||||
|
||||
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++;
|
||||
}
|
||||
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)
|
||||
|
||||
#define count_objects(list, member) do { \
|
||||
list_for_each_entry(obj, list, member) { \
|
||||
size += i915_gem_obj_ggtt_size(obj); \
|
||||
size += i915_gem_obj_total_ggtt_size(obj); \
|
||||
++count; \
|
||||
if (obj->map_and_fenceable) { \
|
||||
mappable_size += i915_gem_obj_ggtt_size(obj); \
|
||||
@ -405,7 +419,7 @@ static void print_batch_pool_stats(struct seq_file *m,
|
||||
|
||||
#define count_vmas(list, member) do { \
|
||||
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; \
|
||||
if (vma->obj->map_and_fenceable) { \
|
||||
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)
|
||||
describe_obj(m, obj);
|
||||
seq_putc(m, '\n');
|
||||
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++;
|
||||
}
|
||||
|
||||
|
@ -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_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;
|
||||
|
||||
pinned = 0;
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
|
||||
if (i915_gem_obj_is_pinned(obj))
|
||||
pinned += i915_gem_obj_ggtt_size(obj);
|
||||
list_for_each_entry(vma, &ggtt->base.active_list, mm_list)
|
||||
if (vma->pin_count)
|
||||
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);
|
||||
|
||||
args->aper_size = dev_priv->gtt.base.total;
|
||||
@ -5468,4 +5472,3 @@ bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user