James/linux-scsi, The following patch for megaraid_sas adds a throttlequeuedepth module parameter. This allows a user to adjust the queue depth of the adapter when throttled due to I/O timeout. Signed-off-by: Adam Radford <aradford@xxxxxxxxx> diff -Naur scsi/drivers/scsi/megaraid/megaraid_sas_base.c scsi.new/drivers/scsi/megaraid/megaraid_sas_base.c --- scsi/drivers/scsi/megaraid/megaraid_sas_base.c 2012-07-17 14:33:50.681233390 -0700 +++ scsi.new/drivers/scsi/megaraid/megaraid_sas_base.c 2012-07-17 14:40:59.507233383 -0700 @@ -71,6 +71,11 @@ module_param(msix_disable, int, S_IRUGO); MODULE_PARM_DESC(msix_disable, "Disable MSI-X interrupt handling. Default: 0"); +static int throttlequeuedepth = MEGASAS_THROTTLE_QUEUE_DEPTH; +module_param(throttlequeuedepth, int, S_IRUGO); +MODULE_PARM_DESC(throttlequeuedepth, + "Adapter queue depth when throttled due to I/O timeout. Default: 16"); + MODULE_LICENSE("GPL"); MODULE_VERSION(MEGASAS_VERSION); MODULE_AUTHOR("megaraidlinux@xxxxxxx"); @@ -1595,8 +1600,9 @@ { unsigned long flags; if (instance->flag & MEGASAS_FW_BUSY - && time_after(jiffies, instance->last_time + 5 * HZ) - && atomic_read(&instance->fw_outstanding) < 17) { + && time_after(jiffies, instance->last_time + 5 * HZ) + && atomic_read(&instance->fw_outstanding) < + instance->throttlequeuedepth + 1) { spin_lock_irqsave(instance->host->host_lock, flags); instance->flag &= ~MEGASAS_FW_BUSY; @@ -1914,7 +1920,7 @@ /* FW is busy, throttle IO */ spin_lock_irqsave(instance->host->host_lock, flags); - instance->host->can_queue = 16; + instance->host->can_queue = instance->throttlequeuedepth; instance->last_time = jiffies; instance->flag |= MEGASAS_FW_BUSY; @@ -3577,6 +3583,24 @@ kfree(ctrl_info); + /* Check for valid throttlequeuedepth module parameter */ + if (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY || + instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) { + if (throttlequeuedepth > (instance->max_fw_cmds - + MEGASAS_SKINNY_INT_CMDS)) + instance->throttlequeuedepth = + MEGASAS_THROTTLE_QUEUE_DEPTH; + else + instance->throttlequeuedepth = throttlequeuedepth; + } else { + if (throttlequeuedepth > (instance->max_fw_cmds - + MEGASAS_INT_CMDS)) + instance->throttlequeuedepth = + MEGASAS_THROTTLE_QUEUE_DEPTH; + else + instance->throttlequeuedepth = throttlequeuedepth; + } + /* * Setup tasklet for cmd completion */ diff -Naur scsi/drivers/scsi/megaraid/megaraid_sas.h scsi.new/drivers/scsi/megaraid/megaraid_sas.h --- scsi/drivers/scsi/megaraid/megaraid_sas.h 2012-07-17 14:33:50.683231556 -0700 +++ scsi.new/drivers/scsi/megaraid/megaraid_sas.h 2012-07-17 14:42:44.066172702 -0700 @@ -747,6 +747,7 @@ #define MEGASAS_RESET_NOTICE_INTERVAL 5 #define MEGASAS_IOCTL_CMD 0 #define MEGASAS_DEFAULT_CMD_TIMEOUT 90 +#define MEGASAS_THROTTLE_QUEUE_DEPTH 16 /* * FW reports the maximum of number of commands that it can accept (maximum @@ -1364,6 +1365,7 @@ unsigned long bar; long reset_flags; struct mutex reset_mutex; + int throttlequeuedepth; }; enum {
Attachment:
megaraid_sas.patch2
Description: Binary data