]> git.hungrycats.org Git - linux/commitdiff
dm-bufio: fix warnings about duplicate slab caches
authorMikulas Patocka <mpatocka@redhat.com>
Mon, 11 Nov 2024 15:48:18 +0000 (16:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 12:54:07 +0000 (13:54 +0100)
commit 42964e4b5e3ac95090bdd23ed7da2a941ccd902c upstream.

The commit 4c39529663b9 adds a warning about duplicate cache names if
CONFIG_DEBUG_VM is selected. These warnings are triggered by the dm-bufio
code. The dm-bufio code allocates a slab cache with each client. It is
not possible to preallocate the caches in the module init function
because the size of auxiliary per-buffer data is not known at this point.

So, this commit changes dm-bufio so that it appends a unique atomic value
to the cache name, to avoid the warnings.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Fixes: 4c39529663b9 ("slab: Warn on duplicate cache names when DEBUG_VM=y")
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/dm-bufio.c

index 098bf526136c942508b4e6bf302ad4cc5c5c1399..468cf819930a1dafed21250f8318addae5cb3413 100644 (file)
@@ -2474,7 +2474,8 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
        int r;
        unsigned int num_locks;
        struct dm_bufio_client *c;
-       char slab_name[27];
+       char slab_name[64];
+       static atomic_t seqno = ATOMIC_INIT(0);
 
        if (!block_size || block_size & ((1 << SECTOR_SHIFT) - 1)) {
                DMERR("%s: block size not specified or is not multiple of 512b", __func__);
@@ -2525,7 +2526,8 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
            (block_size < PAGE_SIZE || !is_power_of_2(block_size))) {
                unsigned int align = min(1U << __ffs(block_size), (unsigned int)PAGE_SIZE);
 
-               snprintf(slab_name, sizeof(slab_name), "dm_bufio_cache-%u", block_size);
+               snprintf(slab_name, sizeof(slab_name), "dm_bufio_cache-%u-%u",
+                                       block_size, atomic_inc_return(&seqno));
                c->slab_cache = kmem_cache_create(slab_name, block_size, align,
                                                  SLAB_RECLAIM_ACCOUNT, NULL);
                if (!c->slab_cache) {
@@ -2534,9 +2536,11 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
                }
        }
        if (aux_size)
-               snprintf(slab_name, sizeof(slab_name), "dm_bufio_buffer-%u", aux_size);
+               snprintf(slab_name, sizeof(slab_name), "dm_bufio_buffer-%u-%u",
+                                       aux_size, atomic_inc_return(&seqno));
        else
-               snprintf(slab_name, sizeof(slab_name), "dm_bufio_buffer");
+               snprintf(slab_name, sizeof(slab_name), "dm_bufio_buffer-%u",
+                                       atomic_inc_return(&seqno));
        c->slab_buffer = kmem_cache_create(slab_name, sizeof(struct dm_buffer) + aux_size,
                                           0, SLAB_RECLAIM_ACCOUNT, NULL);
        if (!c->slab_buffer) {