Commit 72ca2876 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

null_blk: refactor tag_set setup



Move the tagset initialization out of null_add_dev into a new
null_setup_tagset helper, and move the shared vs local differences
out of null_init_tag_set into the callers.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Tested-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20240220093248.3290292-4-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent e32b0855
Loading
Loading
Loading
Loading
+51 −55
Original line number Diff line number Diff line
@@ -1759,53 +1759,63 @@ static int null_gendisk_register(struct nullb *nullb)
	return add_disk(disk);
}

static int null_init_tag_set(struct nullb *nullb, struct blk_mq_tag_set *set)
static int null_init_tag_set(struct blk_mq_tag_set *set, int poll_queues)
{
	unsigned int flags = BLK_MQ_F_SHOULD_MERGE;
	int hw_queues, numa_node;
	unsigned int queue_depth;
	int poll_queues;
	set->ops = &null_mq_ops;
	set->cmd_size = sizeof(struct nullb_cmd);
	set->timeout = 5 * HZ;
	set->nr_maps = 1;
	if (poll_queues) {
		set->nr_hw_queues += poll_queues;
		set->nr_maps += 2;
	}
	return blk_mq_alloc_tag_set(set);
}

	if (nullb) {
		hw_queues = nullb->dev->submit_queues;
		poll_queues = nullb->dev->poll_queues;
		queue_depth = nullb->dev->hw_queue_depth;
		numa_node = nullb->dev->home_node;
		if (nullb->dev->no_sched)
			flags |= BLK_MQ_F_NO_SCHED;
		if (nullb->dev->shared_tag_bitmap)
			flags |= BLK_MQ_F_TAG_HCTX_SHARED;
		if (nullb->dev->blocking)
			flags |= BLK_MQ_F_BLOCKING;
	} else {
		hw_queues = g_submit_queues;
		poll_queues = g_poll_queues;
		queue_depth = g_hw_queue_depth;
		numa_node = g_home_node;
static int null_init_global_tag_set(void)
{
	int error;

	if (tag_set.ops)
		return 0;

	tag_set.nr_hw_queues = g_submit_queues;
	tag_set.queue_depth = g_hw_queue_depth;
	tag_set.numa_node = g_home_node;
	tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
	if (g_no_sched)
			flags |= BLK_MQ_F_NO_SCHED;
		tag_set.flags |= BLK_MQ_F_NO_SCHED;
	if (g_shared_tag_bitmap)
			flags |= BLK_MQ_F_TAG_HCTX_SHARED;
		tag_set.flags |= BLK_MQ_F_TAG_HCTX_SHARED;
	if (g_blocking)
			flags |= BLK_MQ_F_BLOCKING;
		tag_set.flags |= BLK_MQ_F_BLOCKING;

	error = null_init_tag_set(&tag_set, g_poll_queues);
	if (error)
		tag_set.ops = NULL;
	return error;
}

	set->ops = &null_mq_ops;
	set->cmd_size	= sizeof(struct nullb_cmd);
	set->flags = flags;
	set->driver_data = nullb;
	set->nr_hw_queues = hw_queues;
	set->queue_depth = queue_depth;
	set->numa_node = numa_node;
	set->timeout = 5 * HZ;
	if (poll_queues) {
		set->nr_hw_queues += poll_queues;
		set->nr_maps = 3;
	} else {
		set->nr_maps = 1;
static int null_setup_tagset(struct nullb *nullb)
{
	if (nullb->dev->shared_tags) {
		nullb->tag_set = &tag_set;
		return null_init_global_tag_set();
	}

	return blk_mq_alloc_tag_set(set);
	nullb->tag_set = &nullb->__tag_set;
	nullb->tag_set->driver_data = nullb;
	nullb->tag_set->nr_hw_queues = nullb->dev->submit_queues;
	nullb->tag_set->queue_depth = nullb->dev->hw_queue_depth;
	nullb->tag_set->numa_node = nullb->dev->home_node;
	nullb->tag_set->flags = BLK_MQ_F_SHOULD_MERGE;
	if (nullb->dev->no_sched)
		nullb->tag_set->flags |= BLK_MQ_F_NO_SCHED;
	if (nullb->dev->shared_tag_bitmap)
		nullb->tag_set->flags |= BLK_MQ_F_TAG_HCTX_SHARED;
	if (nullb->dev->blocking)
		nullb->tag_set->flags |= BLK_MQ_F_BLOCKING;
	return null_init_tag_set(nullb->tag_set, nullb->dev->poll_queues);
}

static int null_validate_conf(struct nullb_device *dev)
@@ -1904,21 +1914,7 @@ static int null_add_dev(struct nullb_device *dev)
	if (rv)
		goto out_free_nullb;

	if (dev->shared_tags) {
		if (!tag_set.ops) {
			rv = null_init_tag_set(NULL, &tag_set);
			if (rv) {
				tag_set.ops = NULL;
				goto out_cleanup_queues;
			}
		}
		nullb->tag_set = &tag_set;
		rv = 0;
	} else {
		nullb->tag_set = &nullb->__tag_set;
		rv = null_init_tag_set(nullb, nullb->tag_set);
	}

	rv = null_setup_tagset(nullb);
	if (rv)
		goto out_cleanup_queues;