|
@@ -71,6 +71,11 @@ static int msix_disable;
|
|
|
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@lsi.com");
|
|
@@ -1595,8 +1600,9 @@ megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
|
|
|
{
|
|
|
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 @@ blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
|
|
|
/* 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 @@ static int megasas_init_fw(struct megasas_instance *instance)
|
|
|
|
|
|
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
|
|
|
*/
|