The patch titled aic94xx: Increase can_queue and cmds_per_lun has been added to the -mm tree. Its filename is aic94xx-increase-can_queue-and-cmds_per_lun.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: aic94xx: Increase can_queue and cmds_per_lun From: "Darrick J. Wong" <djwong@xxxxxxxxxx> Set sets cmd_per_lun and can_queue in the aic94xx driver's scsi_host_template to better performing values than what's there currently. The cmd_per_lun setting is stolen straight out of the adp94xx source, and can_queue is derived from the max_scb value that we calculate in asd_init_hw. To the best of my (admittedly limited) knowledge, this method provides the correct values (can_queue = 443 in both adp94xx and aic94xx on my 9405W) but if anybody knows better, please enlighten me. :) That said, the effect of leaving these values set to 1 is terrible performance in the case of either (a) certain Maxtor SAS drives flying solo or (b) flooding several disks with I/O simultaneously (md-raid). There may be more scenarios where we see similar problems that I haven't uncovered. Just for grins, I ran bogodisk (an O_DIRECT-enabled read speed test) against three different scenarios: 1) adp94xx 1.0.8-6, pounded into 2.6.18-rc4 [green] 2) aic94xx 1.0.2, without this patch [red] 3) aic94xx 1.0.2, with this [blue] ...with these results: http://sweaglesw.net/~djwong/programs/bogodisk/bd_graphs/bad_sas.0.png As you can see, the read performance is cut in half by the aic94xx driver not getting a chance to have multiple I/Os in flight at any given time. With the patch, the two drivers are fairly close bandwidth-wise. Also thanks to Mike Anderson for helping me figure this out. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/scsi/aic94xx/aic94xx_hwi.h | 3 +++ drivers/scsi/aic94xx/aic94xx_init.c | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff -puN drivers/scsi/aic94xx/aic94xx_hwi.h~aic94xx-increase-can_queue-and-cmds_per_lun drivers/scsi/aic94xx/aic94xx_hwi.h --- a/drivers/scsi/aic94xx/aic94xx_hwi.h~aic94xx-increase-can_queue-and-cmds_per_lun +++ a/drivers/scsi/aic94xx/aic94xx_hwi.h @@ -36,6 +36,9 @@ #include "aic94xx.h" #include "aic94xx_sas.h" +/* Leave a few empty data buffers. */ +#define ASD_FREE_SCBS 3 + /* Define ASD_MAX_PHYS to the maximum phys ever. Currently 8. */ #define ASD_MAX_PHYS 8 #define ASD_PCBA_SN_SIZE 12 diff -puN drivers/scsi/aic94xx/aic94xx_init.c~aic94xx-increase-can_queue-and-cmds_per_lun drivers/scsi/aic94xx/aic94xx_init.c --- a/drivers/scsi/aic94xx/aic94xx_init.c~aic94xx-increase-can_queue-and-cmds_per_lun +++ a/drivers/scsi/aic94xx/aic94xx_init.c @@ -71,7 +71,7 @@ static struct scsi_host_template aic94xx .change_queue_type = sas_change_queue_type, .bios_param = sas_bios_param, .can_queue = 1, - .cmd_per_lun = 1, + .cmd_per_lun = 2, .this_id = -1, .sg_tablesize = SG_ALL, .max_sectors = SCSI_DEFAULT_MAX_SECTORS, @@ -612,13 +612,17 @@ static int __devinit asd_pci_probe(struc goto Err_free_cache; asd_printk("device %s: SAS addr %llx, PCBA SN %s, %d phys, %d enabled " - "phys, flash %s, BIOS %s%d\n", + "phys, flash %s, BIOS %s%d, SCBs %d\n", pci_name(dev), SAS_ADDR(asd_ha->hw_prof.sas_addr), asd_ha->hw_prof.pcba_sn, asd_ha->hw_prof.max_phys, asd_ha->hw_prof.num_phys, asd_ha->hw_prof.flash.present ? "present" : "not present", asd_ha->hw_prof.bios.present ? "build " : "not present", - asd_ha->hw_prof.bios.bld); + asd_ha->hw_prof.bios.bld, + asd_ha->hw_prof.max_scbs); + + aic94xx_sht.can_queue = asd_ha->hw_prof.max_scbs - ASD_FREE_SCBS; + shost->can_queue = aic94xx_sht.can_queue; if (use_msi) pci_enable_msi(asd_ha->pcidev); _ Patches currently in -mm which might be from djwong@xxxxxxxxxx are aic94xx-increase-can_queue-and-cmds_per_lun.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html