Patrik Jakobsson 20eb37
From d9eae83d785863e5a83ca8ad4952b7116bbfaff7 Mon Sep 17 00:00:00 2001
Patrik Jakobsson 20eb37
From: Jason Ekstrand <jason@jlekstrand.net>
Patrik Jakobsson 20eb37
Date: Wed, 21 Jul 2021 10:23:58 -0500
Patrik Jakobsson 20eb37
Subject: drm/i915: Make the kmem slab for i915_buddy_block a global
Patrik Jakobsson 20eb37
MIME-Version: 1.0
Patrik Jakobsson 20eb37
Content-Type: text/plain; charset=UTF-8
Patrik Jakobsson 20eb37
Content-Transfer-Encoding: 8bit
Patrik Jakobsson 20eb37
Git-commit: 0f4651359a235a702b383076fc2ccbd90d9bedb4
Patrik Jakobsson 20eb37
Patch-mainline: v5.15-rc1
Patrik Jakobsson 20eb37
References: jsc#SLE-22601
Patrik Jakobsson 20eb37
Patrik Jakobsson 20eb37
There's no reason that I can tell why this should be per-i915_buddy_mm
Patrik Jakobsson 20eb37
and doing so causes KMEM_CACHE to throw dmesg warnings because it tries
Patrik Jakobsson 20eb37
to create a debugfs entry with the name i915_buddy_block multiple times.
Patrik Jakobsson 20eb37
We could handle this by carefully giving each slab its own name but that
Patrik Jakobsson 20eb37
brings its own pain because then we have to store that string somewhere
Patrik Jakobsson 20eb37
and manage the lifetimes of the different slabs.  The most likely
Patrik Jakobsson 20eb37
outcome would be a global atomic which we increment to get a new name or
Patrik Jakobsson 20eb37
something like that.
Patrik Jakobsson 20eb37
Patrik Jakobsson 20eb37
The much easier solution is to use the i915_globals system like we do
Patrik Jakobsson 20eb37
for every other slab in i915.  This ensures that we have exactly one of
Patrik Jakobsson 20eb37
them for each i915 driver load and it gets neatly created on module load
Patrik Jakobsson 20eb37
and destroyed on module unload.  Using the globals system also means
Patrik Jakobsson 20eb37
that its now tied into the shrink handler so we can properly respond to
Patrik Jakobsson 20eb37
low-memory situations.
Patrik Jakobsson 20eb37
Patrik Jakobsson 20eb37
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Patrik Jakobsson 20eb37
Fixes: 88be9a0a06b7 ("drm/i915/ttm: add ttm_buddy_man")
Patrik Jakobsson 20eb37
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Patrik Jakobsson 20eb37
Cc: Matthew Auld <matthew.auld@intel.com>
Patrik Jakobsson 20eb37
Cc: Christian König <christian.koenig@amd.com>
Patrik Jakobsson 20eb37
[danvet: Rebase against removal of global shrink code]
Patrik Jakobsson 20eb37
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Patrik Jakobsson 20eb37
Link: https://patchwork.freedesktop.org/patch/msgid/20210721152358.2893314-7-jason@jlekstrand.net
Patrik Jakobsson 20eb37
Signed-off-by: Patrik Jakobsson <pjakobsson@suse.de>
Patrik Jakobsson 20eb37
---
Patrik Jakobsson 20eb37
 drivers/gpu/drm/i915/i915_buddy.c   | 38 +++++++++++++++++++++--------
Patrik Jakobsson 20eb37
 drivers/gpu/drm/i915/i915_buddy.h   |  3 ++-
Patrik Jakobsson 20eb37
 drivers/gpu/drm/i915/i915_globals.c |  2 ++
Patrik Jakobsson 20eb37
 3 files changed, 32 insertions(+), 11 deletions(-)
Patrik Jakobsson 20eb37
Patrik Jakobsson 20eb37
diff --git a/drivers/gpu/drm/i915/i915_buddy.c b/drivers/gpu/drm/i915/i915_buddy.c
Patrik Jakobsson 20eb37
index 29dd7d0310c1..caabcaea3be7 100644
Patrik Jakobsson 20eb37
--- a/drivers/gpu/drm/i915/i915_buddy.c
Patrik Jakobsson 20eb37
+++ b/drivers/gpu/drm/i915/i915_buddy.c
Patrik Jakobsson 20eb37
@@ -8,8 +8,14 @@
Patrik Jakobsson 20eb37
 #include "i915_buddy.h"
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 #include "i915_gem.h"
Patrik Jakobsson 20eb37
+#include "i915_globals.h"
Patrik Jakobsson 20eb37
 #include "i915_utils.h"
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
+static struct i915_global_buddy {
Patrik Jakobsson 20eb37
+	struct i915_global base;
Patrik Jakobsson 20eb37
+	struct kmem_cache *slab_blocks;
Patrik Jakobsson 20eb37
+} global;
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
 static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
 						 struct i915_buddy_block *parent,
Patrik Jakobsson 20eb37
 						 unsigned int order,
Patrik Jakobsson 20eb37
@@ -19,7 +25,7 @@ static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 	GEM_BUG_ON(order > I915_BUDDY_MAX_ORDER);
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
-	block = kmem_cache_zalloc(mm->slab_blocks, GFP_KERNEL);
Patrik Jakobsson 20eb37
+	block = kmem_cache_zalloc(global.slab_blocks, GFP_KERNEL);
Patrik Jakobsson 20eb37
 	if (!block)
Patrik Jakobsson 20eb37
 		return NULL;
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
@@ -34,7 +40,7 @@ static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
 static void i915_block_free(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
 			    struct i915_buddy_block *block)
Patrik Jakobsson 20eb37
 {
Patrik Jakobsson 20eb37
-	kmem_cache_free(mm->slab_blocks, block);
Patrik Jakobsson 20eb37
+	kmem_cache_free(global.slab_blocks, block);
Patrik Jakobsson 20eb37
 }
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 static void mark_allocated(struct i915_buddy_block *block)
Patrik Jakobsson 20eb37
@@ -85,15 +91,11 @@ int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size)
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 	GEM_BUG_ON(mm->max_order > I915_BUDDY_MAX_ORDER);
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
-	mm->slab_blocks = KMEM_CACHE(i915_buddy_block, SLAB_HWCACHE_ALIGN);
Patrik Jakobsson 20eb37
-	if (!mm->slab_blocks)
Patrik Jakobsson 20eb37
-		return -ENOMEM;
Patrik Jakobsson 20eb37
-
Patrik Jakobsson 20eb37
 	mm->free_list = kmalloc_array(mm->max_order + 1,
Patrik Jakobsson 20eb37
 				      sizeof(struct list_head),
Patrik Jakobsson 20eb37
 				      GFP_KERNEL);
Patrik Jakobsson 20eb37
 	if (!mm->free_list)
Patrik Jakobsson 20eb37
-		goto out_destroy_slab;
Patrik Jakobsson 20eb37
+		return -ENOMEM;
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 	for (i = 0; i <= mm->max_order; ++i)
Patrik Jakobsson 20eb37
 		INIT_LIST_HEAD(&mm->free_list[i]);
Patrik Jakobsson 20eb37
@@ -145,8 +147,6 @@ int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size)
Patrik Jakobsson 20eb37
 	kfree(mm->roots);
Patrik Jakobsson 20eb37
 out_free_list:
Patrik Jakobsson 20eb37
 	kfree(mm->free_list);
Patrik Jakobsson 20eb37
-out_destroy_slab:
Patrik Jakobsson 20eb37
-	kmem_cache_destroy(mm->slab_blocks);
Patrik Jakobsson 20eb37
 	return -ENOMEM;
Patrik Jakobsson 20eb37
 }
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
@@ -161,7 +161,6 @@ void i915_buddy_fini(struct i915_buddy_mm *mm)
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 	kfree(mm->roots);
Patrik Jakobsson 20eb37
 	kfree(mm->free_list);
Patrik Jakobsson 20eb37
-	kmem_cache_destroy(mm->slab_blocks);
Patrik Jakobsson 20eb37
 }
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 static int split_block(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
@@ -410,3 +409,22 @@ int i915_buddy_alloc_range(struct i915_buddy_mm *mm,
Patrik Jakobsson 20eb37
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
Patrik Jakobsson 20eb37
 #include "selftests/i915_buddy.c"
Patrik Jakobsson 20eb37
 #endif
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
+static void i915_global_buddy_exit(void)
Patrik Jakobsson 20eb37
+{
Patrik Jakobsson 20eb37
+	kmem_cache_destroy(global.slab_blocks);
Patrik Jakobsson 20eb37
+}
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
+static struct i915_global_buddy global = { {
Patrik Jakobsson 20eb37
+	.exit = i915_global_buddy_exit,
Patrik Jakobsson 20eb37
+} };
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
+int __init i915_global_buddy_init(void)
Patrik Jakobsson 20eb37
+{
Patrik Jakobsson 20eb37
+	global.slab_blocks = KMEM_CACHE(i915_buddy_block, 0);
Patrik Jakobsson 20eb37
+	if (!global.slab_blocks)
Patrik Jakobsson 20eb37
+		return -ENOMEM;
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
+	i915_global_register(&global.base);
Patrik Jakobsson 20eb37
+	return 0;
Patrik Jakobsson 20eb37
+}
Patrik Jakobsson 20eb37
diff --git a/drivers/gpu/drm/i915/i915_buddy.h b/drivers/gpu/drm/i915/i915_buddy.h
Patrik Jakobsson 20eb37
index 37f8c42071d1..d8f26706de52 100644
Patrik Jakobsson 20eb37
--- a/drivers/gpu/drm/i915/i915_buddy.h
Patrik Jakobsson 20eb37
+++ b/drivers/gpu/drm/i915/i915_buddy.h
Patrik Jakobsson 20eb37
@@ -47,7 +47,6 @@ struct i915_buddy_block {
Patrik Jakobsson 20eb37
  * i915_buddy_alloc* and i915_buddy_free* should suffice.
Patrik Jakobsson 20eb37
  */
Patrik Jakobsson 20eb37
 struct i915_buddy_mm {
Patrik Jakobsson 20eb37
-	struct kmem_cache *slab_blocks;
Patrik Jakobsson 20eb37
 	/* Maintain a free list for each order. */
Patrik Jakobsson 20eb37
 	struct list_head *free_list;
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
@@ -130,4 +129,6 @@ void i915_buddy_free(struct i915_buddy_mm *mm, struct i915_buddy_block *block);
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 void i915_buddy_free_list(struct i915_buddy_mm *mm, struct list_head *objects);
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
+int i915_global_buddy_init(void);
Patrik Jakobsson 20eb37
+
Patrik Jakobsson 20eb37
 #endif
Patrik Jakobsson 20eb37
diff --git a/drivers/gpu/drm/i915/i915_globals.c b/drivers/gpu/drm/i915/i915_globals.c
Patrik Jakobsson 20eb37
index 0a1b8920a3ba..91198f5b0a06 100644
Patrik Jakobsson 20eb37
--- a/drivers/gpu/drm/i915/i915_globals.c
Patrik Jakobsson 20eb37
+++ b/drivers/gpu/drm/i915/i915_globals.c
Patrik Jakobsson 20eb37
@@ -8,6 +8,7 @@
Patrik Jakobsson 20eb37
 #include <linux/workqueue.h>
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 #include "i915_active.h"
Patrik Jakobsson 20eb37
+#include "i915_buddy.h"
Patrik Jakobsson 20eb37
 #include "gem/i915_gem_context.h"
Patrik Jakobsson 20eb37
 #include "gem/i915_gem_object.h"
Patrik Jakobsson 20eb37
 #include "i915_globals.h"
Patrik Jakobsson 20eb37
@@ -34,6 +35,7 @@ static void __i915_globals_cleanup(void)
Patrik Jakobsson 20eb37
 
Patrik Jakobsson 20eb37
 static __initconst int (* const initfn[])(void) = {
Patrik Jakobsson 20eb37
 	i915_global_active_init,
Patrik Jakobsson 20eb37
+	i915_global_buddy_init,
Patrik Jakobsson 20eb37
 	i915_global_context_init,
Patrik Jakobsson 20eb37
 	i915_global_gem_context_init,
Patrik Jakobsson 20eb37
 	i915_global_objects_init,
Patrik Jakobsson 20eb37
-- 
Patrik Jakobsson 20eb37
2.33.1
Patrik Jakobsson 20eb37