All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
	Kenny.Ho@amd.com, "Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org,
	"Stéphane Marchesin" <marcheu@chromium.org>,
	"Christian König" <christian.koenig@amd.com>,
	"Zefan Li" <lizefan.x@bytedance.com>,
	"Dave Airlie" <airlied@redhat.com>, "Tejun Heo" <tj@kernel.org>,
	cgroups@vger.kernel.org, "T . J . Mercier" <tjmercier@google.com>
Subject: [PATCH 17/17] drm/i915: Wire up to the drm cgroup memory stats
Date: Wed, 12 Jul 2023 12:46:05 +0100	[thread overview]
Message-ID: <20230712114605.519432-18-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <20230712114605.519432-1-tvrtko.ursulin@linux.intel.com>

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

Simply refactor the existing helpers which collate the data for fdinfo
and share them with thin drm cgroup controller callbacks.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c     |   4 +
 drivers/gpu/drm/i915/i915_drm_client.c | 183 ++++++++++++++++---------
 drivers/gpu/drm/i915/i915_drm_client.h |  11 +-
 3 files changed, 129 insertions(+), 69 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 3b9d47c2097b..a299edc9eb79 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1795,6 +1795,10 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 static const struct drm_cgroup_ops i915_drm_cgroup_ops = {
 	.active_time_us = i915_drm_cgroup_get_active_time_us,
 	.signal_budget = i915_drm_cgroup_signal_budget,
+
+	.num_memory_regions	= i915_drm_cgroup_num_memory_regions,
+	.memory_region_name	= i915_drm_cgroup_memory_region_name,
+	.memory_stats		= i915_drm_cgroup_memory_stats,
 };
 #endif
 
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 9be007b10523..c54b1ac753c6 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -29,7 +29,7 @@ struct i915_drm_client *i915_drm_client_alloc(void)
 	kref_init(&client->kref);
 	spin_lock_init(&client->ctx_lock);
 	INIT_LIST_HEAD(&client->ctx_list);
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	spin_lock_init(&client->objects_lock);
 	INIT_LIST_HEAD(&client->objects_list);
 #endif
@@ -46,6 +46,89 @@ void __i915_drm_client_free(struct kref *kref)
 }
 
 #if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
+static void
+obj_meminfo(struct drm_i915_gem_object *obj,
+	    struct drm_memory_stats *stats,
+	    unsigned int num)
+{
+	struct intel_memory_region *mr;
+	u64 sz = obj->base.size;
+	enum intel_region_id id;
+	unsigned int i;
+
+	/* Attribute size and shared to all possible memory regions. */
+	for (i = 0; i < obj->mm.n_placements; i++) {
+		mr = obj->mm.placements[i];
+		id = mr->id;
+
+		if (WARN_ON_ONCE(id >= num))
+			return;
+
+		if (obj->base.handle_count > 1)
+			stats[id].shared += sz;
+		else
+			stats[id].private += sz;
+	}
+
+	/* Attribute other categories to only the current region. */
+	mr = obj->mm.region;
+	if (mr)
+		id = mr->id;
+	else
+		id = INTEL_REGION_SMEM;
+
+	if (WARN_ON_ONCE(id >= num))
+		return;
+
+	if (!obj->mm.n_placements) {
+		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;
+	}
+}
+
+static void
+memory_stats(struct drm_file *file,
+	     struct drm_memory_stats *stats,
+	     unsigned int num)
+{
+	struct drm_i915_file_private *fpriv = file->driver_priv;
+	struct i915_drm_client *client = fpriv->client;
+	struct drm_i915_gem_object *obj;
+	struct list_head *pos;
+	unsigned int id;
+
+	/* Public objects. */
+	spin_lock(&file->table_lock);
+	idr_for_each_entry(&file->object_idr, obj, id)
+		obj_meminfo(obj, stats, num);
+	spin_unlock(&file->table_lock);
+
+	/* Internal objects. */
+	rcu_read_lock();
+	list_for_each_rcu(pos, &client->objects_list) {
+		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
+							 client_link));
+		if (!obj)
+			continue;
+		obj_meminfo(obj, stats, num);
+		i915_gem_object_put(obj);
+	}
+	rcu_read_unlock();
+}
+
 static const char * const uabi_class_names[] = {
 	[I915_ENGINE_CLASS_RENDER] = "render",
 	[I915_ENGINE_CLASS_COPY] = "copy",
@@ -255,83 +338,47 @@ int i915_drm_cgroup_signal_budget(struct drm_file *file, u64 usage, u64 budget)
 
 	return ret;
 }
+
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *dev)
+{
+	return INTEL_REGION_UNKNOWN;
+}
+
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *dev,
+					       unsigned int index)
+{
+	const struct drm_i915_private *i915 = to_i915(dev);
+
+	if (index < ARRAY_SIZE(i915->mm.regions)) {
+		struct intel_memory_region *mr = i915->mm.regions[index];
+
+		if (mr)
+			return mr->name;
+	}
+
+	return NULL;
+}
+
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *file,
+					  struct drm_memory_stats *stats,
+					  unsigned int num)
+{
+	memory_stats(file, stats, num);
+
+	return DRM_GEM_OBJECT_RESIDENT | DRM_GEM_OBJECT_PURGEABLE;
+}
 #endif
 
 #ifdef CONFIG_PROC_FS
-static void
-obj_meminfo(struct drm_i915_gem_object *obj,
-	    struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
-{
-	struct intel_memory_region *mr;
-	u64 sz = obj->base.size;
-	enum intel_region_id id;
-	unsigned int i;
-
-	/* Attribute size and shared to all possible memory regions. */
-	for (i = 0; i < obj->mm.n_placements; i++) {
-		mr = obj->mm.placements[i];
-		id = mr->id;
-
-		if (obj->base.handle_count > 1)
-			stats[id].shared += sz;
-		else
-			stats[id].private += sz;
-	}
-
-	/* Attribute other categories to only the current region. */
-	mr = obj->mm.region;
-	if (mr)
-		id = mr->id;
-	else
-		id = INTEL_REGION_SMEM;
-
-	if (!obj->mm.n_placements) {
-		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;
-	}
-}
-
 static void show_meminfo(struct drm_printer *p, struct drm_file *file)
 {
 	struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
 	struct drm_i915_file_private *fpriv = file->driver_priv;
-	struct i915_drm_client *client = fpriv->client;
 	struct drm_i915_private *i915 = fpriv->i915;
-	struct drm_i915_gem_object *obj;
 	struct intel_memory_region *mr;
-	struct list_head *pos;
 	unsigned int id;
 
-	/* Public objects. */
-	spin_lock(&file->table_lock);
-	idr_for_each_entry(&file->object_idr, obj, id)
-		obj_meminfo(obj, stats);
-	spin_unlock(&file->table_lock);
-
-	/* Internal objects. */
-	rcu_read_lock();
-	list_for_each_rcu(pos, &client->objects_list) {
-		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
-							 client_link));
-		if (!obj)
-			continue;
-		obj_meminfo(obj, stats);
-		i915_gem_object_put(obj);
-	}
-	rcu_read_unlock();
+	memory_stats(file, stats, ARRAY_SIZE(stats));
 
 	for_each_memory_region(mr, i915, id)
 		drm_print_memory_stats(p,
@@ -382,7 +429,9 @@ void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file)
 	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
 		show_client_class(p, i915, file_priv->client, i);
 }
+#endif
 
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index 6eadc9596b8f..8b34be25e887 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -29,7 +29,7 @@ struct i915_drm_client {
 	spinlock_t ctx_lock; /* For add/remove from ctx_list. */
 	struct list_head ctx_list; /* List of contexts belonging to client. */
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	/**
 	 * @objects_lock: lock protecting @objects_list
 	 */
@@ -74,7 +74,7 @@ struct i915_drm_client *i915_drm_client_alloc(void);
 
 void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file);
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj);
 bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj);
@@ -101,4 +101,11 @@ u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file);
 int i915_drm_cgroup_signal_budget(struct drm_file *file,
 				  u64 usage, u64 budget);
 
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *);
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *,
+					       unsigned int index);
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *,
+					  struct drm_memory_stats *,
+					  unsigned int num);
+
 #endif /* !__I915_DRM_CLIENT_H__ */
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
	Kenny.Ho@amd.com, "Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org,
	"Stéphane Marchesin" <marcheu@chromium.org>,
	"Christian König" <christian.koenig@amd.com>,
	"Zefan Li" <lizefan.x@bytedance.com>,
	"Dave Airlie" <airlied@redhat.com>, "Tejun Heo" <tj@kernel.org>,
	cgroups@vger.kernel.org, "T . J . Mercier" <tjmercier@google.com>
Subject: [Intel-gfx] [PATCH 17/17] drm/i915: Wire up to the drm cgroup memory stats
Date: Wed, 12 Jul 2023 12:46:05 +0100	[thread overview]
Message-ID: <20230712114605.519432-18-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <20230712114605.519432-1-tvrtko.ursulin@linux.intel.com>

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

Simply refactor the existing helpers which collate the data for fdinfo
and share them with thin drm cgroup controller callbacks.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c     |   4 +
 drivers/gpu/drm/i915/i915_drm_client.c | 183 ++++++++++++++++---------
 drivers/gpu/drm/i915/i915_drm_client.h |  11 +-
 3 files changed, 129 insertions(+), 69 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 3b9d47c2097b..a299edc9eb79 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1795,6 +1795,10 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 static const struct drm_cgroup_ops i915_drm_cgroup_ops = {
 	.active_time_us = i915_drm_cgroup_get_active_time_us,
 	.signal_budget = i915_drm_cgroup_signal_budget,
+
+	.num_memory_regions	= i915_drm_cgroup_num_memory_regions,
+	.memory_region_name	= i915_drm_cgroup_memory_region_name,
+	.memory_stats		= i915_drm_cgroup_memory_stats,
 };
 #endif
 
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 9be007b10523..c54b1ac753c6 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -29,7 +29,7 @@ struct i915_drm_client *i915_drm_client_alloc(void)
 	kref_init(&client->kref);
 	spin_lock_init(&client->ctx_lock);
 	INIT_LIST_HEAD(&client->ctx_list);
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	spin_lock_init(&client->objects_lock);
 	INIT_LIST_HEAD(&client->objects_list);
 #endif
@@ -46,6 +46,89 @@ void __i915_drm_client_free(struct kref *kref)
 }
 
 #if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
+static void
+obj_meminfo(struct drm_i915_gem_object *obj,
+	    struct drm_memory_stats *stats,
+	    unsigned int num)
+{
+	struct intel_memory_region *mr;
+	u64 sz = obj->base.size;
+	enum intel_region_id id;
+	unsigned int i;
+
+	/* Attribute size and shared to all possible memory regions. */
+	for (i = 0; i < obj->mm.n_placements; i++) {
+		mr = obj->mm.placements[i];
+		id = mr->id;
+
+		if (WARN_ON_ONCE(id >= num))
+			return;
+
+		if (obj->base.handle_count > 1)
+			stats[id].shared += sz;
+		else
+			stats[id].private += sz;
+	}
+
+	/* Attribute other categories to only the current region. */
+	mr = obj->mm.region;
+	if (mr)
+		id = mr->id;
+	else
+		id = INTEL_REGION_SMEM;
+
+	if (WARN_ON_ONCE(id >= num))
+		return;
+
+	if (!obj->mm.n_placements) {
+		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;
+	}
+}
+
+static void
+memory_stats(struct drm_file *file,
+	     struct drm_memory_stats *stats,
+	     unsigned int num)
+{
+	struct drm_i915_file_private *fpriv = file->driver_priv;
+	struct i915_drm_client *client = fpriv->client;
+	struct drm_i915_gem_object *obj;
+	struct list_head *pos;
+	unsigned int id;
+
+	/* Public objects. */
+	spin_lock(&file->table_lock);
+	idr_for_each_entry(&file->object_idr, obj, id)
+		obj_meminfo(obj, stats, num);
+	spin_unlock(&file->table_lock);
+
+	/* Internal objects. */
+	rcu_read_lock();
+	list_for_each_rcu(pos, &client->objects_list) {
+		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
+							 client_link));
+		if (!obj)
+			continue;
+		obj_meminfo(obj, stats, num);
+		i915_gem_object_put(obj);
+	}
+	rcu_read_unlock();
+}
+
 static const char * const uabi_class_names[] = {
 	[I915_ENGINE_CLASS_RENDER] = "render",
 	[I915_ENGINE_CLASS_COPY] = "copy",
@@ -255,83 +338,47 @@ int i915_drm_cgroup_signal_budget(struct drm_file *file, u64 usage, u64 budget)
 
 	return ret;
 }
+
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *dev)
+{
+	return INTEL_REGION_UNKNOWN;
+}
+
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *dev,
+					       unsigned int index)
+{
+	const struct drm_i915_private *i915 = to_i915(dev);
+
+	if (index < ARRAY_SIZE(i915->mm.regions)) {
+		struct intel_memory_region *mr = i915->mm.regions[index];
+
+		if (mr)
+			return mr->name;
+	}
+
+	return NULL;
+}
+
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *file,
+					  struct drm_memory_stats *stats,
+					  unsigned int num)
+{
+	memory_stats(file, stats, num);
+
+	return DRM_GEM_OBJECT_RESIDENT | DRM_GEM_OBJECT_PURGEABLE;
+}
 #endif
 
 #ifdef CONFIG_PROC_FS
-static void
-obj_meminfo(struct drm_i915_gem_object *obj,
-	    struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
-{
-	struct intel_memory_region *mr;
-	u64 sz = obj->base.size;
-	enum intel_region_id id;
-	unsigned int i;
-
-	/* Attribute size and shared to all possible memory regions. */
-	for (i = 0; i < obj->mm.n_placements; i++) {
-		mr = obj->mm.placements[i];
-		id = mr->id;
-
-		if (obj->base.handle_count > 1)
-			stats[id].shared += sz;
-		else
-			stats[id].private += sz;
-	}
-
-	/* Attribute other categories to only the current region. */
-	mr = obj->mm.region;
-	if (mr)
-		id = mr->id;
-	else
-		id = INTEL_REGION_SMEM;
-
-	if (!obj->mm.n_placements) {
-		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;
-	}
-}
-
 static void show_meminfo(struct drm_printer *p, struct drm_file *file)
 {
 	struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
 	struct drm_i915_file_private *fpriv = file->driver_priv;
-	struct i915_drm_client *client = fpriv->client;
 	struct drm_i915_private *i915 = fpriv->i915;
-	struct drm_i915_gem_object *obj;
 	struct intel_memory_region *mr;
-	struct list_head *pos;
 	unsigned int id;
 
-	/* Public objects. */
-	spin_lock(&file->table_lock);
-	idr_for_each_entry(&file->object_idr, obj, id)
-		obj_meminfo(obj, stats);
-	spin_unlock(&file->table_lock);
-
-	/* Internal objects. */
-	rcu_read_lock();
-	list_for_each_rcu(pos, &client->objects_list) {
-		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
-							 client_link));
-		if (!obj)
-			continue;
-		obj_meminfo(obj, stats);
-		i915_gem_object_put(obj);
-	}
-	rcu_read_unlock();
+	memory_stats(file, stats, ARRAY_SIZE(stats));
 
 	for_each_memory_region(mr, i915, id)
 		drm_print_memory_stats(p,
@@ -382,7 +429,9 @@ void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file)
 	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
 		show_client_class(p, i915, file_priv->client, i);
 }
+#endif
 
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index 6eadc9596b8f..8b34be25e887 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -29,7 +29,7 @@ struct i915_drm_client {
 	spinlock_t ctx_lock; /* For add/remove from ctx_list. */
 	struct list_head ctx_list; /* List of contexts belonging to client. */
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	/**
 	 * @objects_lock: lock protecting @objects_list
 	 */
@@ -74,7 +74,7 @@ struct i915_drm_client *i915_drm_client_alloc(void);
 
 void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file);
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj);
 bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj);
@@ -101,4 +101,11 @@ u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file);
 int i915_drm_cgroup_signal_budget(struct drm_file *file,
 				  u64 usage, u64 budget);
 
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *);
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *,
+					       unsigned int index);
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *,
+					  struct drm_memory_stats *,
+					  unsigned int num);
+
 #endif /* !__I915_DRM_CLIENT_H__ */
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
	"Brian Welty" <brian.welty@intel.com>,
	Kenny.Ho@amd.com, "Tvrtko Ursulin" <tvrtko.ursulin@intel.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org,
	"Stéphane Marchesin" <marcheu@chromium.org>,
	"Christian König" <christian.koenig@amd.com>,
	"Zefan Li" <lizefan.x@bytedance.com>,
	"Dave Airlie" <airlied@redhat.com>, "Tejun Heo" <tj@kernel.org>,
	cgroups@vger.kernel.org, "T . J . Mercier" <tjmercier@google.com>
Subject: [PATCH 17/17] drm/i915: Wire up to the drm cgroup memory stats
Date: Wed, 12 Jul 2023 12:46:05 +0100	[thread overview]
Message-ID: <20230712114605.519432-18-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <20230712114605.519432-1-tvrtko.ursulin@linux.intel.com>

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

Simply refactor the existing helpers which collate the data for fdinfo
and share them with thin drm cgroup controller callbacks.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c     |   4 +
 drivers/gpu/drm/i915/i915_drm_client.c | 183 ++++++++++++++++---------
 drivers/gpu/drm/i915/i915_drm_client.h |  11 +-
 3 files changed, 129 insertions(+), 69 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 3b9d47c2097b..a299edc9eb79 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1795,6 +1795,10 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 static const struct drm_cgroup_ops i915_drm_cgroup_ops = {
 	.active_time_us = i915_drm_cgroup_get_active_time_us,
 	.signal_budget = i915_drm_cgroup_signal_budget,
+
+	.num_memory_regions	= i915_drm_cgroup_num_memory_regions,
+	.memory_region_name	= i915_drm_cgroup_memory_region_name,
+	.memory_stats		= i915_drm_cgroup_memory_stats,
 };
 #endif
 
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 9be007b10523..c54b1ac753c6 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -29,7 +29,7 @@ struct i915_drm_client *i915_drm_client_alloc(void)
 	kref_init(&client->kref);
 	spin_lock_init(&client->ctx_lock);
 	INIT_LIST_HEAD(&client->ctx_list);
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	spin_lock_init(&client->objects_lock);
 	INIT_LIST_HEAD(&client->objects_list);
 #endif
@@ -46,6 +46,89 @@ void __i915_drm_client_free(struct kref *kref)
 }
 
 #if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
+static void
+obj_meminfo(struct drm_i915_gem_object *obj,
+	    struct drm_memory_stats *stats,
+	    unsigned int num)
+{
+	struct intel_memory_region *mr;
+	u64 sz = obj->base.size;
+	enum intel_region_id id;
+	unsigned int i;
+
+	/* Attribute size and shared to all possible memory regions. */
+	for (i = 0; i < obj->mm.n_placements; i++) {
+		mr = obj->mm.placements[i];
+		id = mr->id;
+
+		if (WARN_ON_ONCE(id >= num))
+			return;
+
+		if (obj->base.handle_count > 1)
+			stats[id].shared += sz;
+		else
+			stats[id].private += sz;
+	}
+
+	/* Attribute other categories to only the current region. */
+	mr = obj->mm.region;
+	if (mr)
+		id = mr->id;
+	else
+		id = INTEL_REGION_SMEM;
+
+	if (WARN_ON_ONCE(id >= num))
+		return;
+
+	if (!obj->mm.n_placements) {
+		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;
+	}
+}
+
+static void
+memory_stats(struct drm_file *file,
+	     struct drm_memory_stats *stats,
+	     unsigned int num)
+{
+	struct drm_i915_file_private *fpriv = file->driver_priv;
+	struct i915_drm_client *client = fpriv->client;
+	struct drm_i915_gem_object *obj;
+	struct list_head *pos;
+	unsigned int id;
+
+	/* Public objects. */
+	spin_lock(&file->table_lock);
+	idr_for_each_entry(&file->object_idr, obj, id)
+		obj_meminfo(obj, stats, num);
+	spin_unlock(&file->table_lock);
+
+	/* Internal objects. */
+	rcu_read_lock();
+	list_for_each_rcu(pos, &client->objects_list) {
+		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
+							 client_link));
+		if (!obj)
+			continue;
+		obj_meminfo(obj, stats, num);
+		i915_gem_object_put(obj);
+	}
+	rcu_read_unlock();
+}
+
 static const char * const uabi_class_names[] = {
 	[I915_ENGINE_CLASS_RENDER] = "render",
 	[I915_ENGINE_CLASS_COPY] = "copy",
@@ -255,83 +338,47 @@ int i915_drm_cgroup_signal_budget(struct drm_file *file, u64 usage, u64 budget)
 
 	return ret;
 }
+
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *dev)
+{
+	return INTEL_REGION_UNKNOWN;
+}
+
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *dev,
+					       unsigned int index)
+{
+	const struct drm_i915_private *i915 = to_i915(dev);
+
+	if (index < ARRAY_SIZE(i915->mm.regions)) {
+		struct intel_memory_region *mr = i915->mm.regions[index];
+
+		if (mr)
+			return mr->name;
+	}
+
+	return NULL;
+}
+
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *file,
+					  struct drm_memory_stats *stats,
+					  unsigned int num)
+{
+	memory_stats(file, stats, num);
+
+	return DRM_GEM_OBJECT_RESIDENT | DRM_GEM_OBJECT_PURGEABLE;
+}
 #endif
 
 #ifdef CONFIG_PROC_FS
-static void
-obj_meminfo(struct drm_i915_gem_object *obj,
-	    struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
-{
-	struct intel_memory_region *mr;
-	u64 sz = obj->base.size;
-	enum intel_region_id id;
-	unsigned int i;
-
-	/* Attribute size and shared to all possible memory regions. */
-	for (i = 0; i < obj->mm.n_placements; i++) {
-		mr = obj->mm.placements[i];
-		id = mr->id;
-
-		if (obj->base.handle_count > 1)
-			stats[id].shared += sz;
-		else
-			stats[id].private += sz;
-	}
-
-	/* Attribute other categories to only the current region. */
-	mr = obj->mm.region;
-	if (mr)
-		id = mr->id;
-	else
-		id = INTEL_REGION_SMEM;
-
-	if (!obj->mm.n_placements) {
-		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;
-	}
-}
-
 static void show_meminfo(struct drm_printer *p, struct drm_file *file)
 {
 	struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
 	struct drm_i915_file_private *fpriv = file->driver_priv;
-	struct i915_drm_client *client = fpriv->client;
 	struct drm_i915_private *i915 = fpriv->i915;
-	struct drm_i915_gem_object *obj;
 	struct intel_memory_region *mr;
-	struct list_head *pos;
 	unsigned int id;
 
-	/* Public objects. */
-	spin_lock(&file->table_lock);
-	idr_for_each_entry(&file->object_idr, obj, id)
-		obj_meminfo(obj, stats);
-	spin_unlock(&file->table_lock);
-
-	/* Internal objects. */
-	rcu_read_lock();
-	list_for_each_rcu(pos, &client->objects_list) {
-		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
-							 client_link));
-		if (!obj)
-			continue;
-		obj_meminfo(obj, stats);
-		i915_gem_object_put(obj);
-	}
-	rcu_read_unlock();
+	memory_stats(file, stats, ARRAY_SIZE(stats));
 
 	for_each_memory_region(mr, i915, id)
 		drm_print_memory_stats(p,
@@ -382,7 +429,9 @@ void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file)
 	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
 		show_client_class(p, i915, file_priv->client, i);
 }
+#endif
 
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index 6eadc9596b8f..8b34be25e887 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -29,7 +29,7 @@ struct i915_drm_client {
 	spinlock_t ctx_lock; /* For add/remove from ctx_list. */
 	struct list_head ctx_list; /* List of contexts belonging to client. */
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	/**
 	 * @objects_lock: lock protecting @objects_list
 	 */
@@ -74,7 +74,7 @@ struct i915_drm_client *i915_drm_client_alloc(void);
 
 void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file);
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj);
 bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj);
@@ -101,4 +101,11 @@ u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file);
 int i915_drm_cgroup_signal_budget(struct drm_file *file,
 				  u64 usage, u64 budget);
 
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *);
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *,
+					       unsigned int index);
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *,
+					  struct drm_memory_stats *,
+					  unsigned int num);
+
 #endif /* !__I915_DRM_CLIENT_H__ */
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Tejun Heo" <tj@kernel.org>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	"Zefan Li" <lizefan.x@bytedance.com>,
	"Dave Airlie" <airlied@redhat.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Rob Clark" <robdclark@chromium.org>,
	"Stéphane Marchesin" <marcheu@chromium.org>,
	"T . J . Mercier" <tjmercier@google.com>,
	Kenny.Ho@amd.com, "Christian König" <christian.koenig@amd.com>,
	"Brian Welty" <brian.welty@intel.com>,
	"Tvrtko Ursulin" <tvrtko.ursulin@intel.com>
Subject: [PATCH 17/17] drm/i915: Wire up to the drm cgroup memory stats
Date: Wed, 12 Jul 2023 12:46:05 +0100	[thread overview]
Message-ID: <20230712114605.519432-18-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <20230712114605.519432-1-tvrtko.ursulin@linux.intel.com>

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

Simply refactor the existing helpers which collate the data for fdinfo
and share them with thin drm cgroup controller callbacks.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c     |   4 +
 drivers/gpu/drm/i915/i915_drm_client.c | 183 ++++++++++++++++---------
 drivers/gpu/drm/i915/i915_drm_client.h |  11 +-
 3 files changed, 129 insertions(+), 69 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 3b9d47c2097b..a299edc9eb79 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1795,6 +1795,10 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 static const struct drm_cgroup_ops i915_drm_cgroup_ops = {
 	.active_time_us = i915_drm_cgroup_get_active_time_us,
 	.signal_budget = i915_drm_cgroup_signal_budget,
+
+	.num_memory_regions	= i915_drm_cgroup_num_memory_regions,
+	.memory_region_name	= i915_drm_cgroup_memory_region_name,
+	.memory_stats		= i915_drm_cgroup_memory_stats,
 };
 #endif
 
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 9be007b10523..c54b1ac753c6 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -29,7 +29,7 @@ struct i915_drm_client *i915_drm_client_alloc(void)
 	kref_init(&client->kref);
 	spin_lock_init(&client->ctx_lock);
 	INIT_LIST_HEAD(&client->ctx_list);
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	spin_lock_init(&client->objects_lock);
 	INIT_LIST_HEAD(&client->objects_list);
 #endif
@@ -46,6 +46,89 @@ void __i915_drm_client_free(struct kref *kref)
 }
 
 #if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
+static void
+obj_meminfo(struct drm_i915_gem_object *obj,
+	    struct drm_memory_stats *stats,
+	    unsigned int num)
+{
+	struct intel_memory_region *mr;
+	u64 sz = obj->base.size;
+	enum intel_region_id id;
+	unsigned int i;
+
+	/* Attribute size and shared to all possible memory regions. */
+	for (i = 0; i < obj->mm.n_placements; i++) {
+		mr = obj->mm.placements[i];
+		id = mr->id;
+
+		if (WARN_ON_ONCE(id >= num))
+			return;
+
+		if (obj->base.handle_count > 1)
+			stats[id].shared += sz;
+		else
+			stats[id].private += sz;
+	}
+
+	/* Attribute other categories to only the current region. */
+	mr = obj->mm.region;
+	if (mr)
+		id = mr->id;
+	else
+		id = INTEL_REGION_SMEM;
+
+	if (WARN_ON_ONCE(id >= num))
+		return;
+
+	if (!obj->mm.n_placements) {
+		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;
+	}
+}
+
+static void
+memory_stats(struct drm_file *file,
+	     struct drm_memory_stats *stats,
+	     unsigned int num)
+{
+	struct drm_i915_file_private *fpriv = file->driver_priv;
+	struct i915_drm_client *client = fpriv->client;
+	struct drm_i915_gem_object *obj;
+	struct list_head *pos;
+	unsigned int id;
+
+	/* Public objects. */
+	spin_lock(&file->table_lock);
+	idr_for_each_entry(&file->object_idr, obj, id)
+		obj_meminfo(obj, stats, num);
+	spin_unlock(&file->table_lock);
+
+	/* Internal objects. */
+	rcu_read_lock();
+	list_for_each_rcu(pos, &client->objects_list) {
+		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
+							 client_link));
+		if (!obj)
+			continue;
+		obj_meminfo(obj, stats, num);
+		i915_gem_object_put(obj);
+	}
+	rcu_read_unlock();
+}
+
 static const char * const uabi_class_names[] = {
 	[I915_ENGINE_CLASS_RENDER] = "render",
 	[I915_ENGINE_CLASS_COPY] = "copy",
@@ -255,83 +338,47 @@ int i915_drm_cgroup_signal_budget(struct drm_file *file, u64 usage, u64 budget)
 
 	return ret;
 }
+
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *dev)
+{
+	return INTEL_REGION_UNKNOWN;
+}
+
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *dev,
+					       unsigned int index)
+{
+	const struct drm_i915_private *i915 = to_i915(dev);
+
+	if (index < ARRAY_SIZE(i915->mm.regions)) {
+		struct intel_memory_region *mr = i915->mm.regions[index];
+
+		if (mr)
+			return mr->name;
+	}
+
+	return NULL;
+}
+
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *file,
+					  struct drm_memory_stats *stats,
+					  unsigned int num)
+{
+	memory_stats(file, stats, num);
+
+	return DRM_GEM_OBJECT_RESIDENT | DRM_GEM_OBJECT_PURGEABLE;
+}
 #endif
 
 #ifdef CONFIG_PROC_FS
-static void
-obj_meminfo(struct drm_i915_gem_object *obj,
-	    struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
-{
-	struct intel_memory_region *mr;
-	u64 sz = obj->base.size;
-	enum intel_region_id id;
-	unsigned int i;
-
-	/* Attribute size and shared to all possible memory regions. */
-	for (i = 0; i < obj->mm.n_placements; i++) {
-		mr = obj->mm.placements[i];
-		id = mr->id;
-
-		if (obj->base.handle_count > 1)
-			stats[id].shared += sz;
-		else
-			stats[id].private += sz;
-	}
-
-	/* Attribute other categories to only the current region. */
-	mr = obj->mm.region;
-	if (mr)
-		id = mr->id;
-	else
-		id = INTEL_REGION_SMEM;
-
-	if (!obj->mm.n_placements) {
-		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;
-	}
-}
-
 static void show_meminfo(struct drm_printer *p, struct drm_file *file)
 {
 	struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
 	struct drm_i915_file_private *fpriv = file->driver_priv;
-	struct i915_drm_client *client = fpriv->client;
 	struct drm_i915_private *i915 = fpriv->i915;
-	struct drm_i915_gem_object *obj;
 	struct intel_memory_region *mr;
-	struct list_head *pos;
 	unsigned int id;
 
-	/* Public objects. */
-	spin_lock(&file->table_lock);
-	idr_for_each_entry(&file->object_idr, obj, id)
-		obj_meminfo(obj, stats);
-	spin_unlock(&file->table_lock);
-
-	/* Internal objects. */
-	rcu_read_lock();
-	list_for_each_rcu(pos, &client->objects_list) {
-		obj = i915_gem_object_get_rcu(list_entry(pos, typeof(*obj),
-							 client_link));
-		if (!obj)
-			continue;
-		obj_meminfo(obj, stats);
-		i915_gem_object_put(obj);
-	}
-	rcu_read_unlock();
+	memory_stats(file, stats, ARRAY_SIZE(stats));
 
 	for_each_memory_region(mr, i915, id)
 		drm_print_memory_stats(p,
@@ -382,7 +429,9 @@ void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file)
 	for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
 		show_client_class(p, i915, file_priv->client, i);
 }
+#endif
 
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index 6eadc9596b8f..8b34be25e887 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -29,7 +29,7 @@ struct i915_drm_client {
 	spinlock_t ctx_lock; /* For add/remove from ctx_list. */
 	struct list_head ctx_list; /* List of contexts belonging to client. */
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 	/**
 	 * @objects_lock: lock protecting @objects_list
 	 */
@@ -74,7 +74,7 @@ struct i915_drm_client *i915_drm_client_alloc(void);
 
 void i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file);
 
-#ifdef CONFIG_PROC_FS
+#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
 void i915_drm_client_add_object(struct i915_drm_client *client,
 				struct drm_i915_gem_object *obj);
 bool i915_drm_client_remove_object(struct drm_i915_gem_object *obj);
@@ -101,4 +101,11 @@ u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file);
 int i915_drm_cgroup_signal_budget(struct drm_file *file,
 				  u64 usage, u64 budget);
 
+unsigned int i915_drm_cgroup_num_memory_regions(const struct drm_device *);
+const char *i915_drm_cgroup_memory_region_name(const struct drm_device *,
+					       unsigned int index);
+unsigned int i915_drm_cgroup_memory_stats(struct drm_file *,
+					  struct drm_memory_stats *,
+					  unsigned int num);
+
 #endif /* !__I915_DRM_CLIENT_H__ */
-- 
2.39.2


  parent reply	other threads:[~2023-07-12 11:46 UTC|newest]

Thread overview: 156+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-12 11:45 [RFC v5 00/17] DRM cgroup controller with scheduling control and memory stats Tvrtko Ursulin
2023-07-12 11:45 ` Tvrtko Ursulin
2023-07-12 11:45 ` Tvrtko Ursulin
2023-07-12 11:45 ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 01/17] drm/i915: Add ability for tracking buffer objects per client Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 02/17] drm/i915: Record which client owns a VM Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 03/17] drm/i915: Track page table backing store usage Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 04/17] drm/i915: Account ring buffer and context state storage Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 05/17] drm/i915: Implement fdinfo memory stats printing Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 06/17] drm: Update file owner during use Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 07/17] cgroup: Add the DRM cgroup controller Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 08/17] drm/cgroup: Track DRM clients per cgroup Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-21 22:14   ` Tejun Heo
2023-07-21 22:14     ` Tejun Heo
2023-07-21 22:14     ` Tejun Heo
2023-07-21 22:14     ` [Intel-gfx] " Tejun Heo
2023-07-12 11:45 ` [PATCH 09/17] drm/cgroup: Add ability to query drm cgroup GPU time Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 10/17] drm/cgroup: Add over budget signalling callback Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:45 ` [PATCH 11/17] drm/cgroup: Only track clients which are providing drm_cgroup_ops Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` Tvrtko Ursulin
2023-07-12 11:45   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:46 ` [PATCH 12/17] cgroup/drm: Introduce weight based drm cgroup control Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-21 22:17   ` Tejun Heo
2023-07-21 22:17     ` Tejun Heo
2023-07-21 22:17     ` Tejun Heo
2023-07-21 22:17     ` [Intel-gfx] " Tejun Heo
     [not found]     ` <ZLsEEYDFlJZwrJiV-NiLfg/pYEd1N0TnZuCh8vA@public.gmane.org>
2023-07-25 13:46       ` Tvrtko Ursulin
2023-07-25 13:46         ` Tvrtko Ursulin
2023-07-25 13:46         ` Tvrtko Ursulin
2023-07-25 13:46         ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:46 ` [PATCH 13/17] drm/i915: Wire up with drm controller GPU time query Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:46 ` [PATCH 14/17] drm/i915: Implement cgroup controller over budget throttling Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 11:46 ` [PATCH 15/17] cgroup/drm: Expose GPU utilisation Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
     [not found]   ` <20230712114605.519432-16-tvrtko.ursulin-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-21 22:19     ` Tejun Heo
2023-07-21 22:19       ` Tejun Heo
2023-07-21 22:19       ` Tejun Heo
2023-07-21 22:19       ` [Intel-gfx] " Tejun Heo
     [not found]       ` <ZLsEdJeEAPYWFunT-NiLfg/pYEd1N0TnZuCh8vA@public.gmane.org>
2023-07-21 22:20         ` Tejun Heo
2023-07-21 22:20           ` Tejun Heo
2023-07-21 22:20           ` Tejun Heo
2023-07-21 22:20           ` [Intel-gfx] " Tejun Heo
2023-07-25 14:08           ` Tvrtko Ursulin
2023-07-25 14:08             ` Tvrtko Ursulin
2023-07-25 14:08             ` Tvrtko Ursulin
2023-07-25 14:08             ` [Intel-gfx] " Tvrtko Ursulin
     [not found]             ` <3b96cada-3433-139c-3180-1f050f0f80f3-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-25 21:44               ` Tejun Heo
2023-07-25 21:44                 ` Tejun Heo
2023-07-25 21:44                 ` Tejun Heo
2023-07-25 21:44                 ` [Intel-gfx] " Tejun Heo
2023-07-12 11:46 ` [PATCH 16/17] cgroup/drm: Expose memory stats Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
     [not found]   ` <20230712114605.519432-17-tvrtko.ursulin-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-21 22:21     ` Tejun Heo
2023-07-21 22:21       ` Tejun Heo
2023-07-21 22:21       ` Tejun Heo
2023-07-21 22:21       ` [Intel-gfx] " Tejun Heo
2023-07-26 10:14       ` Maarten Lankhorst
2023-07-26 10:14         ` Maarten Lankhorst
2023-07-26 10:14         ` [Intel-gfx] " Maarten Lankhorst
2023-07-26 11:41         ` Tvrtko Ursulin
2023-07-26 11:41           ` Tvrtko Ursulin
2023-07-26 11:41           ` Tvrtko Ursulin
2023-07-26 11:41           ` [Intel-gfx] " Tvrtko Ursulin
     [not found]           ` <89d7181c-6830-ca6e-0c39-caa49d14d474-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-27 11:54             ` Maarten Lankhorst
2023-07-27 11:54               ` Maarten Lankhorst
2023-07-27 11:54               ` Maarten Lankhorst
2023-07-27 11:54               ` [Intel-gfx] " Maarten Lankhorst
2023-07-27 17:08               ` Tvrtko Ursulin
2023-07-27 17:08                 ` Tvrtko Ursulin
2023-07-27 17:08                 ` Tvrtko Ursulin
2023-07-27 17:08                 ` [Intel-gfx] " Tvrtko Ursulin
     [not found]                 ` <5d65d387-2718-06c3-ee5d-8a7da6e3ddfd-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-28 14:15                   ` Tvrtko Ursulin
2023-07-28 14:15                     ` Tvrtko Ursulin
2023-07-28 14:15                     ` Tvrtko Ursulin
2023-07-28 14:15                     ` [Intel-gfx] " Tvrtko Ursulin
     [not found]         ` <ea64d7bf-c01b-f4ad-a36b-f77e2c2ea931-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-26 19:44           ` Tejun Heo
2023-07-26 19:44             ` Tejun Heo
2023-07-26 19:44             ` Tejun Heo
2023-07-26 19:44             ` [Intel-gfx] " Tejun Heo
2023-07-27 13:42             ` Maarten Lankhorst
2023-07-27 13:42               ` Maarten Lankhorst
2023-07-27 13:42               ` Maarten Lankhorst
2023-07-27 13:42               ` [Intel-gfx] " Maarten Lankhorst
     [not found]               ` <05178cf3-df1c-80a7-12ad-816fafbc2df7-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-27 16:43                 ` Tvrtko Ursulin
2023-07-27 16:43                   ` Tvrtko Ursulin
2023-07-27 16:43                   ` Tvrtko Ursulin
2023-07-27 16:43                   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-26 16:44       ` Tvrtko Ursulin
2023-07-26 16:44         ` Tvrtko Ursulin
2023-07-26 16:44         ` Tvrtko Ursulin
2023-07-26 16:44         ` [Intel-gfx] " Tvrtko Ursulin
     [not found]         ` <8959f665-4353-3630-a6c7-5dca60959faa-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-26 19:49           ` Tejun Heo
2023-07-26 19:49             ` Tejun Heo
2023-07-26 19:49             ` Tejun Heo
2023-07-26 19:49             ` [Intel-gfx] " Tejun Heo
2023-07-12 11:46 ` Tvrtko Ursulin [this message]
2023-07-12 11:46   ` [PATCH 17/17] drm/i915: Wire up to the drm cgroup " Tvrtko Ursulin
2023-07-12 11:46   ` Tvrtko Ursulin
2023-07-12 11:46   ` [Intel-gfx] " Tvrtko Ursulin
2023-07-12 14:46 ` [Intel-gfx] ✗ Fi.CI.BUILD: failure for DRM cgroup controller with scheduling control and " Patchwork
2023-07-19 20:31 ` [RFC v5 00/17] " T.J. Mercier
2023-07-19 20:31   ` T.J. Mercier
2023-07-19 20:31   ` T.J. Mercier
2023-07-19 20:31   ` [Intel-gfx] " T.J. Mercier
     [not found]   ` <CABdmKX1PUF+X897ZMOr0RNiYdoiL_2NkcSt+Eh55BfW-05LopQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-07-20 10:55     ` Tvrtko Ursulin
2023-07-20 10:55       ` Tvrtko Ursulin
2023-07-20 10:55       ` Tvrtko Ursulin
2023-07-20 10:55       ` [Intel-gfx] " Tvrtko Ursulin
     [not found]       ` <95de5c1e-f03b-8fb7-b5ef-59ac7ca82f31-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2023-07-20 17:22         ` T.J. Mercier
2023-07-20 17:22           ` T.J. Mercier
2023-07-20 17:22           ` T.J. Mercier
2023-07-20 17:22           ` [Intel-gfx] " T.J. Mercier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230712114605.519432-18-tvrtko.ursulin@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=Intel-gfx@lists.freedesktop.org \
    --cc=Kenny.Ho@amd.com \
    --cc=airlied@redhat.com \
    --cc=cgroups@vger.kernel.org \
    --cc=christian.koenig@amd.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hannes@cmpxchg.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan.x@bytedance.com \
    --cc=marcheu@chromium.org \
    --cc=robdclark@chromium.org \
    --cc=tj@kernel.org \
    --cc=tjmercier@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.