From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

For drivers who only wish to show one memory region called 'system,
and only account the GEM buffer object handles under it.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/drm_file.c | 45 ++++++++++++++++++++++++++++++++++++++
 include/drm/drm_file.h     |  6 +++++
 2 files changed, 51 insertions(+)

diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index e202f79e816d..1e70669dddf7 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -872,6 +872,51 @@ void drm_send_event(struct drm_device *dev, struct 
drm_pending_event *e)
 }
 EXPORT_SYMBOL(drm_send_event);
 
+static void
+add_obj(struct drm_gem_object *obj, struct drm_fdinfo_memory_stat *stats)
+{
+       u64 sz = obj->size;
+
+       stats[0].size += sz;
+
+       if (obj->handle_count > 1)
+               stats[0].shared += sz;
+
+       if (!dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true)))
+               stats[0].active += sz;
+
+       /* Not supported. */
+       stats[0].resident = ~0ull;
+       stats[0].purgeable = ~0ull;
+}
+
+char **
+drm_query_fdinfo_system_region(struct drm_device *dev, unsigned int *num)
+{
+       static char *region[] = {
+               "system",
+       };
+
+       *num = 1;
+
+       return region;
+}
+EXPORT_SYMBOL(drm_query_fdinfo_system_region);
+
+void
+drm_query_fdinfo_system_memory(struct drm_file *file,
+                              struct drm_fdinfo_memory_stat *stats)
+{
+       struct drm_gem_object *obj;
+       int id;
+
+       spin_lock(&file->table_lock);
+       idr_for_each_entry(&file->object_idr, obj, id)
+               add_obj(obj, stats);
+       spin_unlock(&file->table_lock);
+}
+EXPORT_SYMBOL(drm_query_fdinfo_system_memory);
+
 static void
 print_stat(struct drm_printer *p, const char *stat, const char *region, u64 sz)
 {
diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
index 00d48beeac5c..dd7c6fb2c975 100644
--- a/include/drm/drm_file.h
+++ b/include/drm/drm_file.h
@@ -383,6 +383,12 @@ struct drm_fdinfo_memory_stat {
        u64 active;
 };
 
+char **drm_query_fdinfo_system_region(struct drm_device *dev,
+                                     unsigned int *num);
+void drm_query_fdinfo_system_memory(struct drm_file *file,
+                                   struct drm_fdinfo_memory_stat *stats);
+
+
 /**
  * drm_is_primary_client - is this an open file of the primary node
  * @file_priv: DRM file
-- 
2.37.2

Reply via email to