On 06/06/2023 10:47, Tvrtko Ursulin wrote:
On 05/06/2023 23:22, Andi Shyti wrote:
Hi Tvrtko,
On Mon, Jun 05, 2023 at 03:37:20PM +0100, Tvrtko Ursulin wrote:
From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
Use the newly added drm_print_memory_stats helper to show memory
utilisation of our objects in drm/driver specific fdinfo output.
To collect the stats we walk the per memory regions object lists
and accumulate object size into the respective drm_memory_stats
categories.
Objects with multiple possible placements are reported in multiple
regions for total and shared sizes, while other categories are
counted only for the currently active region.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
Cc: Rob Clark <robdclark@xxxxxxxxx>
---
drivers/gpu/drm/i915/i915_drm_client.c | 66 ++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c
b/drivers/gpu/drm/i915/i915_drm_client.c
index 2a44b3876cb5..2a40f763f8f6 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -41,6 +41,70 @@ void __i915_drm_client_free(struct kref *kref)
}
#ifdef CONFIG_PROC_FS
+static void
+add_obj_meminfo(struct drm_i915_gem_object *obj,
+ struct intel_memory_region *mr,
+ struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
+{
+ u64 sz = obj->base.size;
+ enum intel_region_id id;
+ unsigned int i;
+
+ id = mr->id;
+ if (obj->base.handle_count > 1)
+ stats[id].shared += sz;
+ else
+ stats[id].private += sz;
+
+ if (i915_gem_object_has_pages(obj)) {
+ stats[id].resident += sz;
+
+ if (!dma_resv_test_signaled(obj->base.resv,
+ dma_resv_usage_rw(true)))
+ stats[id].active += sz;
+ else if (i915_gem_object_is_shrinkable(obj) &&
+ obj->mm.madv == I915_MADV_DONTNEED)
+ stats[id].purgeable += sz;
this is a bit off... otherwise:
Reviewed-by: Andi Shyti <andi.shyti@xxxxxxxxxxxxxxx>
Thanks!
I will sit on this until I can find time to add some tests to drm_fdinfo.c.
Actually.. Aravind pointed off list that my brain wasn't switched on
when writing this. Fdinfo stats need to be per client and this patch is
therefore almost completely bogus.
Regards,
Tvrtko
Andi
+ }
+
+ /* Attribute size and shared to all possible object memory
regions. */
+ for (i = 0; i < obj->mm.n_placements; i++) {
+ if (obj->mm.placements[i] == mr)
+ continue;
+
+ id = obj->mm.placements[i]->id;
+ if (obj->base.handle_count > 1)
+ stats[id].shared += sz;
+ else
+ stats[id].private += sz;
+ }
+}
+
+static void show_meminfo(struct drm_printer *p, struct drm_file *file)
+{
+ struct drm_i915_file_private *file_priv = file->driver_priv;
+ struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
+ struct drm_i915_private *i915 = file_priv->i915;
+ struct intel_memory_region *mr;
+ unsigned int id;
+
+ for_each_memory_region(mr, i915, id) {
+ struct drm_i915_gem_object *obj;
+
+ mutex_lock(&mr->objects.lock);
+ list_for_each_entry(obj, &mr->objects.list, mm.region_link)
+ add_obj_meminfo(obj, mr, stats);
+ mutex_unlock(&mr->objects.lock);
+ }
+
+ for_each_memory_region(mr, i915, id)
+ drm_print_memory_stats(p,
+ &stats[id],
+ DRM_GEM_OBJECT_RESIDENT |
+ DRM_GEM_OBJECT_PURGEABLE,
+ mr->name);
+}
+
static const char * const uabi_class_names[] = {
[I915_ENGINE_CLASS_RENDER] = "render",
[I915_ENGINE_CLASS_COPY] = "copy",
@@ -102,6 +166,8 @@ void i915_drm_client_fdinfo(struct drm_printer
*p, struct drm_file *file)
*
******************************************************************
*/
+ show_meminfo(p, file);
+
if (GRAPHICS_VER(i915) < 8)
return;
--
2.39.2