Commit f7c4cdc7 authored by John Garry's avatar John Garry Committed by Jens Axboe
Browse files

scsi: scsi_debug: Support host tagset



When host_max_queue is set (> 0), set the Scsi_Host.host_tagset such that
blk-mq will use a hostwide tagset over all SCSI host submission queues.

This means that we may expose all submission queues and always use the hwq
chosen by blk-mq.

And since if sdebug_host_max_queue is set, sdebug_max_queue is fixed to the
same value, we can simplify how sdebug_driver_template.can_queue is set.

Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Tested-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
Acked-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8d98416a
Loading
Loading
Loading
Loading
+10 −18
Original line number Diff line number Diff line
@@ -4696,11 +4696,6 @@ fini:
static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
{
	u16 hwq;

	if (sdebug_host_max_queue) {
		/* Provide a simple method to choose the hwq */
		hwq = smp_processor_id() % submit_queues;
	} else {
	u32 tag = blk_mq_unique_tag(cmnd->request);

	hwq = blk_mq_unique_tag_to_hwq(tag);
@@ -4708,7 +4703,7 @@ static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
	pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
	if (WARN_ON_ONCE(hwq >= submit_queues))
		hwq = 0;
	}

	return sdebug_q_arr + hwq;
}

@@ -7347,9 +7342,6 @@ static int sdebug_driver_probe(struct device *dev)

	sdbg_host = to_sdebug_host(dev);

	if (sdebug_host_max_queue)
		sdebug_driver_template.can_queue = sdebug_host_max_queue;
	else
	sdebug_driver_template.can_queue = sdebug_max_queue;
	if (!sdebug_clustering)
		sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
@@ -7367,11 +7359,11 @@ static int sdebug_driver_probe(struct device *dev)
	}
	/*
	 * Decide whether to tell scsi subsystem that we want mq. The
	 * following should give the same answer for each host. If the host
	 * has a limit of hostwide max commands, then do not set.
	 * following should give the same answer for each host.
	 */
	if (!sdebug_host_max_queue)
	hpnt->nr_hw_queues = submit_queues;
	if (sdebug_host_max_queue)
		hpnt->host_tagset = 1;

	sdbg_host->shost = hpnt;
	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;