From df424c8618e0b06ded2d978818e6d3df4a54a61d Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 15 Feb 2017 10:58:01 +0100 Subject: [PATCH] mpt3sas: implement 'shared_tags' SCSI host flag If the HBA implements a host-wide tagspace we should be signalling this to the SCSI layer to avoid 'can_queue' being reduced, thereby inducing I/O stalls. Signed-off-by: Hannes Reinecke --- drivers/scsi/mpt3sas/mpt3sas_base.c | 5 ++--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 ++ drivers/scsi/scsi_lib.c | 2 ++ include/scsi/scsi_host.h | 5 +++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index 9e31cae..520aee4 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c @@ -3544,10 +3544,9 @@ void mpt3sas_base_clear_st(struct MPT3SAS_ADAPTER *ioc, */ ioc->shost->reserved_cmds = INTERNAL_SCSIIO_CMDS_COUNT; ioc->shost->can_queue = ioc->scsiio_depth - ioc->shost->reserved_cmds; - if (ioc->shost->nr_hw_queues > 1) { + if (ioc->shost->nr_hw_queues > 1) ioc->shost->nr_hw_queues = ioc->msix_vector_count; - ioc->shost->can_queue /= ioc->msix_vector_count; - } + dinitprintk(ioc, pr_info(MPT3SAS_FMT "scsi host: can_queue depth (%d), nr_hw_queues (%d)\n", ioc->name, ioc->shost->can_queue, ioc->shost->nr_hw_queues)); diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 14f7a9d..4088e1a 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c @@ -8585,6 +8585,7 @@ static int scsih_map_queues(struct Scsi_Host *shost) .shost_attrs = mpt3sas_host_attrs, .sdev_attrs = mpt3sas_dev_attrs, .track_queue_depth = 1, + .shared_tags = 1, .cmd_size = sizeof(struct scsiio_tracker), }; @@ -8624,6 +8625,7 @@ static int scsih_map_queues(struct Scsi_Host *shost) .shost_attrs = mpt3sas_host_attrs, .sdev_attrs = mpt3sas_dev_attrs, .track_queue_depth = 1, + .shared_tags = 1, .cmd_size = sizeof(struct scsiio_tracker), }; diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 7100aaa..6bb06ed 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2143,6 +2143,8 @@ int scsi_mq_setup_tags(struct Scsi_Host *shost) shost->tag_set.ops = &scsi_mq_ops; shost->tag_set.nr_hw_queues = shost->nr_hw_queues ? : 1; shost->tag_set.queue_depth = shost->can_queue; + if (shost->hostt->shared_tags) + shost->tag_set.queue_depth /= shost->nr_hw_queues; shost->tag_set.reserved_tags = shost->reserved_cmds; shost->tag_set.cmd_size = cmd_size; shost->tag_set.numa_node = NUMA_NO_NODE; diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index cc83dd6..d344803 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -457,6 +457,11 @@ struct scsi_host_template { unsigned no_async_abort:1; /* + * True if the host uses a shared tag space + */ + unsigned shared_tags:1; + + /* * Countdown for host blocking with no commands outstanding. */ unsigned int max_host_blocked; -- 1.8.5.6