]> www.infradead.org Git - users/hch/configfs.git/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)
committerMikulas Patocka <mpatocka@redhat.com>
Mon, 11 Nov 2024 16:04:18 +0000 (17:04 +0100)
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")
drivers/md/dm-bufio.c

index d478aafa02c97fc5b3c0cfea207a9947debbb0c8..23e0b71b991e75003bb6b6963fe72997fcf3ca0a 100644 (file)
@@ -2471,7 +2471,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__);
@@ -2522,7 +2523,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) {
@@ -2531,9 +2533,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) {