The commit 4c39529663b9 adds a warning about duplicate cache names if
CONFIG_DEBUG_VM is selected. These warnings are triggered by the dm-cache
code.

The dm-cache code allocates a slab cache for each device. This commit
changes it to allocate just one slab cache in the module init function.

Signed-off-by: Mikulas Patocka <mpato...@redhat.com>
Fixes: 4c39529663b9 ("slab: Warn on duplicate cache names when DEBUG_VM=y")

---
 drivers/md/dm-cache-background-tracker.c |   25 ++++++-------------------
 drivers/md/dm-cache-background-tracker.h |    8 ++++++++
 drivers/md/dm-cache-target.c             |   25 ++++++++++++++++++++-----
 3 files changed, 34 insertions(+), 24 deletions(-)

Index: linux-2.6/drivers/md/dm-cache-background-tracker.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-cache-background-tracker.c     2023-09-05 
14:45:58.000000000 +0200
+++ linux-2.6/drivers/md/dm-cache-background-tracker.c  2024-11-07 
15:54:05.000000000 +0100
@@ -11,12 +11,6 @@
 
 #define DM_MSG_PREFIX "dm-background-tracker"
 
-struct bt_work {
-       struct list_head list;
-       struct rb_node node;
-       struct policy_work work;
-};
-
 struct background_tracker {
        unsigned int max_work;
        atomic_t pending_promotes;
@@ -26,10 +20,10 @@ struct background_tracker {
        struct list_head issued;
        struct list_head queued;
        struct rb_root pending;
-
-       struct kmem_cache *work_cache;
 };
 
+struct kmem_cache *btracker_work_cache = NULL;
+
 struct background_tracker *btracker_create(unsigned int max_work)
 {
        struct background_tracker *b = kmalloc(sizeof(*b), GFP_KERNEL);
@@ -48,12 +42,6 @@ struct background_tracker *btracker_crea
        INIT_LIST_HEAD(&b->queued);
 
        b->pending = RB_ROOT;
-       b->work_cache = KMEM_CACHE(bt_work, 0);
-       if (!b->work_cache) {
-               DMERR("couldn't create mempool for background work items");
-               kfree(b);
-               b = NULL;
-       }
 
        return b;
 }
@@ -66,10 +54,9 @@ void btracker_destroy(struct background_
        BUG_ON(!list_empty(&b->issued));
        list_for_each_entry_safe (w, tmp, &b->queued, list) {
                list_del(&w->list);
-               kmem_cache_free(b->work_cache, w);
+               kmem_cache_free(btracker_work_cache, w);
        }
 
-       kmem_cache_destroy(b->work_cache);
        kfree(b);
 }
 EXPORT_SYMBOL_GPL(btracker_destroy);
@@ -180,7 +167,7 @@ static struct bt_work *alloc_work(struct
        if (max_work_reached(b))
                return NULL;
 
-       return kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
+       return kmem_cache_alloc(btracker_work_cache, GFP_NOWAIT);
 }
 
 int btracker_queue(struct background_tracker *b,
@@ -203,7 +190,7 @@ int btracker_queue(struct background_tra
                 * There was a race, we'll just ignore this second
                 * bit of work for the same oblock.
                 */
-               kmem_cache_free(b->work_cache, w);
+               kmem_cache_free(btracker_work_cache, w);
                return -EINVAL;
        }
 
@@ -244,7 +231,7 @@ void btracker_complete(struct background
        update_stats(b, &w->work, -1);
        rb_erase(&w->node, &b->pending);
        list_del(&w->list);
-       kmem_cache_free(b->work_cache, w);
+       kmem_cache_free(btracker_work_cache, w);
 }
 EXPORT_SYMBOL_GPL(btracker_complete);
 
Index: linux-2.6/drivers/md/dm-cache-background-tracker.h
===================================================================
--- linux-2.6.orig/drivers/md/dm-cache-background-tracker.h     2023-09-05 
14:45:58.000000000 +0200
+++ linux-2.6/drivers/md/dm-cache-background-tracker.h  2024-11-07 
15:53:42.000000000 +0100
@@ -26,6 +26,14 @@
  * protected with a spinlock.
  */
 
+struct bt_work {
+       struct list_head list;
+       struct rb_node node;
+       struct policy_work work;
+};
+
+extern struct kmem_cache *btracker_work_cache;
+
 struct background_work;
 struct background_tracker;
 
Index: linux-2.6/drivers/md/dm-cache-target.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-cache-target.c 2024-11-07 12:47:50.000000000 
+0100
+++ linux-2.6/drivers/md/dm-cache-target.c      2024-11-07 15:58:34.000000000 
+0100
@@ -10,6 +10,7 @@
 #include "dm-bio-record.h"
 #include "dm-cache-metadata.h"
 #include "dm-io-tracker.h"
+#include "dm-cache-background-tracker.h"
 
 #include <linux/dm-io.h>
 #include <linux/dm-kcopyd.h>
@@ -2263,7 +2264,7 @@ static int parse_cache_args(struct cache
 
 /*----------------------------------------------------------------*/
 
-static struct kmem_cache *migration_cache;
+static struct kmem_cache *migration_cache = NULL;
 
 #define NOT_CORE_OPTION 1
 
@@ -3445,22 +3446,36 @@ static int __init dm_cache_init(void)
        int r;
 
        migration_cache = KMEM_CACHE(dm_cache_migration, 0);
-       if (!migration_cache)
-               return -ENOMEM;
+       if (!migration_cache) {
+               r = -ENOMEM;
+               goto err;
+       }
+
+       btracker_work_cache = kmem_cache_create("dm_cache_bt_work",
+               sizeof(struct bt_work), __alignof__(struct bt_work), 0, NULL);
+       if (!btracker_work_cache) {
+               r = -ENOMEM;
+               goto err;
+       }
 
        r = dm_register_target(&cache_target);
        if (r) {
-               kmem_cache_destroy(migration_cache);
-               return r;
+               goto err;
        }
 
        return 0;
+
+err:
+       kmem_cache_destroy(migration_cache);
+       kmem_cache_destroy(btracker_work_cache);
+       return r;
 }
 
 static void __exit dm_cache_exit(void)
 {
        dm_unregister_target(&cache_target);
        kmem_cache_destroy(migration_cache);
+       kmem_cache_destroy(btracker_work_cache);
 }
 
 module_init(dm_cache_init);


Reply via email to