Commit 5456ec9d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-6.12/dm-fixes-3' of...

Merge tag 'for-6.12/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mikulas Patocka:

 - fix warnings about duplicate slab cache names

* tag 'for-6.12/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm-cache: fix warnings about duplicate slab caches
  dm-bufio: fix warnings about duplicate slab caches
parents 93db202c 346dbf1b
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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) {
+6 −19
Original line number Diff line number Diff line
@@ -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_create(unsigned int max_work)
	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_tracker *b)
	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 background_tracker *b)
	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_tracker *b,
		 * 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_tracker *b,
	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);

+8 −0
Original line number Diff line number Diff line
@@ -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;

+20 −5
Original line number Diff line number Diff line
@@ -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_args *ca, int argc, char **argv,

/*----------------------------------------------------------------*/

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);