diff options
author | Dan Williams <dan.j.williams@intel.com> | 2011-09-21 00:10:46 +0200 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-10-02 19:36:43 +0200 |
commit | 97a1420d127ca1db2fd665707bf4e9501758147c (patch) | |
tree | 4d89c37ee1e55ec98b733bc968a0896c0a1985e8 /drivers/scsi/libsas/sas_scsi_host.c | |
parent | [SCSI] libsas,libata: fix ->change_queue_{depth|type} for sata devices (diff) | |
download | linux-97a1420d127ca1db2fd665707bf4e9501758147c.tar.xz linux-97a1420d127ca1db2fd665707bf4e9501758147c.zip |
[SCSI] libsas: dynamic queue depth
The queue-depth for libsas-attached devices initializes to 32 and can
only be increased manually via sysfs to a max of 64, while mpt2sas
attached devices initialize to 254 and dynamically float via the
midlayer ->change_queue_depth interface.
No performance regression was observed with this change on the isci
driver.
Tested-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/libsas/sas_scsi_host.c')
-rw-r--r-- | drivers/scsi/libsas/sas_scsi_host.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index 8f3c4cc1bfe4..ebd1417339e9 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -761,8 +761,7 @@ int sas_target_alloc(struct scsi_target *starget) return 0; } -#define SAS_DEF_QD 32 -#define SAS_MAX_QD 64 +#define SAS_DEF_QD 256 int sas_slave_configure(struct scsi_device *scsi_dev) { @@ -805,31 +804,29 @@ void sas_slave_destroy(struct scsi_device *scsi_dev) dev->sata_dev.ap->link.device[0].class = ATA_DEV_NONE; } -int sas_change_queue_depth(struct scsi_device *scsi_dev, int new_depth, - int reason) +int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason) { - struct domain_device *dev = sdev_to_domain_dev(scsi_dev); - int res = min(new_depth, SAS_MAX_QD); + struct domain_device *dev = sdev_to_domain_dev(sdev); if (dev_is_sata(dev)) - return __ata_change_queue_depth(dev->sata_dev.ap, scsi_dev, - new_depth, reason); - - if (reason != SCSI_QDEPTH_DEFAULT) + return __ata_change_queue_depth(dev->sata_dev.ap, sdev, depth, + reason); + + switch (reason) { + case SCSI_QDEPTH_DEFAULT: + case SCSI_QDEPTH_RAMP_UP: + if (!sdev->tagged_supported) + depth = 1; + scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth); + break; + case SCSI_QDEPTH_QFULL: + scsi_track_queue_full(sdev, depth); + break; + default: return -EOPNOTSUPP; - - if (scsi_dev->tagged_supported) - scsi_adjust_queue_depth(scsi_dev, scsi_get_tag_type(scsi_dev), - res); - else { - sas_printk("device %llx LUN %x queue depth changed to 1\n", - SAS_ADDR(dev->sas_addr), - scsi_dev->lun); - scsi_adjust_queue_depth(scsi_dev, 0, 1); - res = 1; } - return res; + return depth; } int sas_change_queue_type(struct scsi_device *scsi_dev, int qt) |