From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> 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.ursulin@xxxxxxxxx> --- 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