Commit ae09a6c1 authored by Sumit.Saxena@avagotech.com's avatar Sumit.Saxena@avagotech.com Committed by Christoph Hellwig

megaraid_sas: reserve commands for IOCTLs and internal DCMDs

1) For fusion adapters, limit reserved frames for non SCSI commands to 8
   (3 for parallel IOCTLs + 5 for driver's internal DCMDs).
   Earlier reserved commands for non SCSI IO frames was set to 32, so with
   this implementation, increased per controller "can_queue".
   Behavior of MFI controllers will remain unchanged.

2) Optimize the code related to per controller's 'can_queue' setting.
Signed-off-by: default avatarSumit Saxena <sumit.saxena@avagotech.com>
Signed-off-by: default avatarChaitra Basappa <chaitra.basappa@avagotech.com>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent c8dd61ef
...@@ -1082,6 +1082,8 @@ enum MR_SCSI_CMD_TYPE { ...@@ -1082,6 +1082,8 @@ enum MR_SCSI_CMD_TYPE {
*/ */
#define MEGASAS_INT_CMDS 32 #define MEGASAS_INT_CMDS 32
#define MEGASAS_SKINNY_INT_CMDS 5 #define MEGASAS_SKINNY_INT_CMDS 5
#define MEGASAS_FUSION_INTERNAL_CMDS 5
#define MEGASAS_FUSION_IOCTL_CMDS 3
#define MEGASAS_MAX_MSIX_QUEUES 128 #define MEGASAS_MAX_MSIX_QUEUES 128
/* /*
...@@ -1687,9 +1689,8 @@ struct megasas_instance { ...@@ -1687,9 +1689,8 @@ struct megasas_instance {
u16 max_num_sge; u16 max_num_sge;
u16 max_fw_cmds; u16 max_fw_cmds;
/* For Fusion its num IOCTL cmds, for others MFI based its
max_fw_cmds */
u16 max_mfi_cmds; u16 max_mfi_cmds;
u16 max_scsi_cmds;
u32 max_sectors_per_req; u32 max_sectors_per_req;
struct megasas_aen_event *ev; struct megasas_aen_event *ev;
...@@ -1765,7 +1766,7 @@ struct megasas_instance { ...@@ -1765,7 +1766,7 @@ struct megasas_instance {
u8 requestorId; u8 requestorId;
char PlasmaFW111; char PlasmaFW111;
char mpio; char mpio;
int throttlequeuedepth; u16 throttlequeuedepth;
u8 mask_interrupts; u8 mask_interrupts;
u8 is_imr; u8 is_imr;
}; };
......
...@@ -78,7 +78,7 @@ static int allow_vf_ioctls; ...@@ -78,7 +78,7 @@ static int allow_vf_ioctls;
module_param(allow_vf_ioctls, int, S_IRUGO); module_param(allow_vf_ioctls, int, S_IRUGO);
MODULE_PARM_DESC(allow_vf_ioctls, "Allow ioctls in SR-IOV VF mode. Default: 0"); MODULE_PARM_DESC(allow_vf_ioctls, "Allow ioctls in SR-IOV VF mode. Default: 0");
static int throttlequeuedepth = MEGASAS_THROTTLE_QUEUE_DEPTH; static unsigned int throttlequeuedepth = MEGASAS_THROTTLE_QUEUE_DEPTH;
module_param(throttlequeuedepth, int, S_IRUGO); module_param(throttlequeuedepth, int, S_IRUGO);
MODULE_PARM_DESC(throttlequeuedepth, MODULE_PARM_DESC(throttlequeuedepth,
"Adapter queue depth when throttled due to I/O timeout. Default: 16"); "Adapter queue depth when throttled due to I/O timeout. Default: 16");
...@@ -1764,6 +1764,7 @@ void ...@@ -1764,6 +1764,7 @@ void
megasas_check_and_restore_queue_depth(struct megasas_instance *instance) megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
{ {
unsigned long flags; unsigned long flags;
if (instance->flag & MEGASAS_FW_BUSY if (instance->flag & MEGASAS_FW_BUSY
&& time_after(jiffies, instance->last_time + 5 * HZ) && time_after(jiffies, instance->last_time + 5 * HZ)
&& atomic_read(&instance->fw_outstanding) < && atomic_read(&instance->fw_outstanding) <
...@@ -1771,13 +1772,8 @@ megasas_check_and_restore_queue_depth(struct megasas_instance *instance) ...@@ -1771,13 +1772,8 @@ megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
spin_lock_irqsave(instance->host->host_lock, flags); spin_lock_irqsave(instance->host->host_lock, flags);
instance->flag &= ~MEGASAS_FW_BUSY; instance->flag &= ~MEGASAS_FW_BUSY;
if (instance->is_imr) {
instance->host->can_queue =
instance->max_fw_cmds - MEGASAS_SKINNY_INT_CMDS;
} else
instance->host->can_queue =
instance->max_fw_cmds - MEGASAS_INT_CMDS;
instance->host->can_queue = instance->max_scsi_cmds;
spin_unlock_irqrestore(instance->host->host_lock, flags); spin_unlock_irqrestore(instance->host->host_lock, flags);
} }
} }
...@@ -4685,23 +4681,38 @@ static int megasas_init_fw(struct megasas_instance *instance) ...@@ -4685,23 +4681,38 @@ static int megasas_init_fw(struct megasas_instance *instance)
if (tmp_sectors && (instance->max_sectors_per_req > tmp_sectors)) if (tmp_sectors && (instance->max_sectors_per_req > tmp_sectors))
instance->max_sectors_per_req = tmp_sectors; instance->max_sectors_per_req = tmp_sectors;
/* Check for valid throttlequeuedepth module parameter */ /*
if (instance->is_imr) { * 1. For fusion adapters, 3 commands for IOCTL and 5 commands
if (throttlequeuedepth > (instance->max_fw_cmds - * for driver's internal DCMDs.
MEGASAS_SKINNY_INT_CMDS)) * 2. For MFI skinny adapters, 5 commands for IOCTL + driver's
instance->throttlequeuedepth = * internal DCMDs.
MEGASAS_THROTTLE_QUEUE_DEPTH; * 3. For rest of MFI adapters, 27 commands reserved for IOCTLs
else * and 5 commands for drivers's internal DCMD.
instance->throttlequeuedepth = throttlequeuedepth; */
if (instance->ctrl_context) {
instance->max_scsi_cmds = instance->max_fw_cmds -
(MEGASAS_FUSION_INTERNAL_CMDS +
MEGASAS_FUSION_IOCTL_CMDS);
sema_init(&instance->ioctl_sem, MEGASAS_FUSION_IOCTL_CMDS);
} else if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY)) {
instance->max_scsi_cmds = instance->max_fw_cmds -
MEGASAS_SKINNY_INT_CMDS;
sema_init(&instance->ioctl_sem, MEGASAS_SKINNY_INT_CMDS);
} else { } else {
if (throttlequeuedepth > (instance->max_fw_cmds - instance->max_scsi_cmds = instance->max_fw_cmds -
MEGASAS_INT_CMDS)) MEGASAS_INT_CMDS;
instance->throttlequeuedepth = sema_init(&instance->ioctl_sem, (MEGASAS_INT_CMDS - 5));
MEGASAS_THROTTLE_QUEUE_DEPTH;
else
instance->throttlequeuedepth = throttlequeuedepth;
} }
/* Check for valid throttlequeuedepth module parameter */
if (throttlequeuedepth &&
throttlequeuedepth <= instance->max_scsi_cmds)
instance->throttlequeuedepth = throttlequeuedepth;
else
instance->throttlequeuedepth =
MEGASAS_THROTTLE_QUEUE_DEPTH;
/* /*
* Setup tasklet for cmd completion * Setup tasklet for cmd completion
*/ */
...@@ -4996,12 +5007,7 @@ static int megasas_io_attach(struct megasas_instance *instance) ...@@ -4996,12 +5007,7 @@ static int megasas_io_attach(struct megasas_instance *instance)
*/ */
host->irq = instance->pdev->irq; host->irq = instance->pdev->irq;
host->unique_id = instance->unique_id; host->unique_id = instance->unique_id;
if (instance->is_imr) { host->can_queue = instance->max_scsi_cmds;
host->can_queue =
instance->max_fw_cmds - MEGASAS_SKINNY_INT_CMDS;
} else
host->can_queue =
instance->max_fw_cmds - MEGASAS_INT_CMDS;
host->this_id = instance->init_id; host->this_id = instance->init_id;
host->sg_tablesize = instance->max_num_sge; host->sg_tablesize = instance->max_num_sge;
...@@ -5264,12 +5270,10 @@ static int megasas_probe_one(struct pci_dev *pdev, ...@@ -5264,12 +5270,10 @@ static int megasas_probe_one(struct pci_dev *pdev,
instance->init_id = MEGASAS_DEFAULT_INIT_ID; instance->init_id = MEGASAS_DEFAULT_INIT_ID;
instance->ctrl_info = NULL; instance->ctrl_info = NULL;
if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) || if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY)) { (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY))
instance->flag_ieee = 1; instance->flag_ieee = 1;
sema_init(&instance->ioctl_sem, MEGASAS_SKINNY_INT_CMDS);
} else
sema_init(&instance->ioctl_sem, (MEGASAS_INT_CMDS - 5));
megasas_dbg_lvl = 0; megasas_dbg_lvl = 0;
instance->flag = 0; instance->flag = 0;
...@@ -6264,9 +6268,6 @@ static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg) ...@@ -6264,9 +6268,6 @@ static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg)
goto out_kfree_ioc; goto out_kfree_ioc;
} }
/*
* We will allow only MEGASAS_INT_CMDS number of parallel ioctl cmds
*/
if (down_interruptible(&instance->ioctl_sem)) { if (down_interruptible(&instance->ioctl_sem)) {
error = -ERESTARTSYS; error = -ERESTARTSYS;
goto out_kfree_ioc; goto out_kfree_ioc;
......
...@@ -1019,8 +1019,12 @@ megasas_init_adapter_fusion(struct megasas_instance *instance) ...@@ -1019,8 +1019,12 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
* does not exceed max cmds that the FW can support * does not exceed max cmds that the FW can support
*/ */
instance->max_fw_cmds = instance->max_fw_cmds-1; instance->max_fw_cmds = instance->max_fw_cmds-1;
/* Only internal cmds (DCMD) need to have MFI frames */
instance->max_mfi_cmds = MEGASAS_INT_CMDS; /*
* Only Driver's internal DCMDs and IOCTL DCMDs needs to have MFI frames
*/
instance->max_mfi_cmds =
MEGASAS_FUSION_INTERNAL_CMDS + MEGASAS_FUSION_IOCTL_CMDS;
max_cmd = instance->max_fw_cmds; max_cmd = instance->max_fw_cmds;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment