public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] megaraid_sas: Enable shared tag map
@ 2014-09-29 11:47 Hannes Reinecke
  2014-09-29 16:52 ` Webb Scales
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Hannes Reinecke @ 2014-09-29 11:47 UTC (permalink / raw)
  To: James Bottomley
  Cc: Christoph Hellwig, linux-scsi, Sumit Saxena, Hannes Reinecke

Megaraid_sas uses a shared pool of commands per HBA, so we
should be enabling a shared tag map.
This will allow the I/O scheduler to make better scheduling
decisions and will avoid BUSY states in the driver.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 34 ++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index f6a69a3..996fa9a 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1659,7 +1659,7 @@ static int megasas_slave_configure(struct scsi_device *sdev)
 	*/
 	blk_queue_rq_timeout(sdev->request_queue,
 		MEGASAS_DEFAULT_CMD_TIMEOUT * HZ);
-
+	sdev->tagged_supported = 1;
 	return 0;
 }
 
@@ -1667,6 +1667,10 @@ static int megasas_slave_alloc(struct scsi_device *sdev)
 {
 	u16             pd_index = 0;
 	struct megasas_instance *instance ;
+
+	/* We have a shared tag map, so TCQ is always supported */
+	sdev->tagged_supported = 1;
+
 	instance = megasas_lookup_instance(sdev->host->host_no);
 	if (sdev->channel < MEGASAS_MAX_PD_CHANNELS) {
 		/*
@@ -1677,13 +1681,20 @@ static int megasas_slave_alloc(struct scsi_device *sdev)
 			sdev->id;
 		if (instance->pd_list[pd_index].driveState ==
 					MR_PD_STATE_SYSTEM) {
+			scsi_activate_tcq(sdev, MEGASAS_DEFAULT_CMD_PER_LUN);
 			return 0;
 		}
 		return -ENXIO;
 	}
+	scsi_activate_tcq(sdev, MEGASAS_DEFAULT_CMD_PER_LUN);
 	return 0;
 }
 
+static void megasas_slave_destroy(struct scsi_device *sdev)
+{
+	scsi_deactivate_tcq(sdev, 1);
+}
+
 void megaraid_sas_kill_hba(struct megasas_instance *instance)
 {
 	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
@@ -2746,6 +2757,21 @@ struct device_attribute *megaraid_host_attrs[] = {
 	NULL,
 };
 
+static int megasas_change_queue_type(struct scsi_device *sdev, int tag_type)
+{
+	if (sdev->host->bqt && sdev->tagged_supported) {
+		scsi_set_tag_type(sdev, tag_type);
+
+		if (tag_type)
+			scsi_activate_tcq(sdev, sdev->queue_depth);
+		else
+			scsi_deactivate_tcq(sdev, sdev->queue_depth);
+	} else
+		tag_type = 0;
+
+	return tag_type;
+}
+
 /*
  * Scsi host template for megaraid_sas driver
  */
@@ -2756,6 +2782,7 @@ static struct scsi_host_template megasas_template = {
 	.proc_name = "megaraid_sas",
 	.slave_configure = megasas_slave_configure,
 	.slave_alloc = megasas_slave_alloc,
+	.slave_destroy = megasas_slave_destroy,
 	.queuecommand = megasas_queue_command,
 	.eh_device_reset_handler = megasas_reset_device,
 	.eh_bus_reset_handler = megasas_reset_bus_host,
@@ -2765,6 +2792,7 @@ static struct scsi_host_template megasas_template = {
 	.bios_param = megasas_bios_param,
 	.use_clustering = ENABLE_CLUSTERING,
 	.change_queue_depth = megasas_change_queue_depth,
+	.change_queue_type = megasas_change_queue_type,
 	.no_write_same = 1,
 };
 
@@ -4909,6 +4937,10 @@ static int megasas_io_attach(struct megasas_instance *instance)
 	host->this_id = instance->init_id;
 	host->sg_tablesize = instance->max_num_sge;
 
+	if (!scsi_init_shared_tag_map(host, host->can_queue))
+		printk(KERN_WARNING "megasas: enable TCQ support, depth %d",
+			host->can_queue);
+
 	if (instance->fw_support_ieee)
 		instance->max_sectors_per_req = MEGASAS_MAX_SECTORS_IEEE;
 
-- 
1.8.5.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2014-10-02 14:32 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-29 11:47 [PATCH] megaraid_sas: Enable shared tag map Hannes Reinecke
2014-09-29 16:52 ` Webb Scales
2014-09-29 17:08   ` James Bottomley
2014-09-30  7:43 ` Christoph Hellwig
2014-09-30  9:08   ` Hannes Reinecke
2014-10-01 18:51 ` Webb Scales
2014-10-01 21:10   ` Christoph Hellwig
2014-10-02  6:51     ` Hannes Reinecke
2014-10-02  9:19       ` Christoph Hellwig
2014-10-02  9:50         ` Hannes Reinecke
2014-10-02 11:36           ` Christoph Hellwig
2014-10-02 12:00             ` Hannes Reinecke
2014-10-02 14:32               ` Christoph Hellwig
2014-10-02 12:05       ` James Bottomley
2014-10-02 12:14         ` Hannes Reinecke
2014-10-02 13:06           ` James Bottomley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox