]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[SCSI] libsas: dynamic queue depth
authorDan Williams <dan.j.williams@intel.com>
Tue, 20 Sep 2011 22:10:46 +0000 (15:10 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 2 Oct 2011 17:36:43 +0000 (12:36 -0500)
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>
drivers/scsi/libsas/sas_scsi_host.c

index 8f3c4cc1bfe41638ffa2af50d4019346a1d5b3a7..ebd1417339e96e5b6ee5c93ca5a0db004ce22940 100644 (file)
@@ -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)