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: Sumit Saxena <sumit.saxena@avagotech.com> Signed-off-by: Chaitra Basappa <chaitra.basappa@avagotech.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
c8dd61eff2
commit
ae09a6c1fd
|
@ -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 {
|
||||||
|
|
||||||
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 {
|
||||||
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;
|
||||||
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
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
* 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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue