Commit bf8dae83 authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.33: Allow per-hba interrupt rate tuning

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 67d12733
...@@ -3643,14 +3643,21 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr, ...@@ -3643,14 +3643,21 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
int val = 0, i; int val = 0, i;
/* fcp_imax is only valid for SLI4 */
if (phba->sli_rev != LPFC_SLI_REV4)
return -EINVAL;
/* Sanity check on user data */ /* Sanity check on user data */
if (!isdigit(buf[0])) if (!isdigit(buf[0]))
return -EINVAL; return -EINVAL;
if (sscanf(buf, "%i", &val) != 1) if (sscanf(buf, "%i", &val) != 1)
return -EINVAL; return -EINVAL;
/* Value range is [636,651042] */ /*
if (val < LPFC_MIM_IMAX || val > LPFC_DMULT_CONST) * Value range for the HBA is [5000,5000000]
* The value for each EQ depends on how many EQs are configured.
*/
if (val < LPFC_MIN_IMAX || val > LPFC_MAX_IMAX)
return -EINVAL; return -EINVAL;
phba->cfg_fcp_imax = (uint32_t)val; phba->cfg_fcp_imax = (uint32_t)val;
...@@ -3662,13 +3669,14 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr, ...@@ -3662,13 +3669,14 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
/* /*
# lpfc_fcp_imax: The maximum number of fast-path FCP interrupts per second # lpfc_fcp_imax: The maximum number of fast-path FCP interrupts per second
# for the HBA.
# #
# Value range is [636,651042]. Default value is 10000. # Value range is [5,000 to 5,000,000]. Default value is 50,000.
*/ */
static int lpfc_fcp_imax = LPFC_FP_DEF_IMAX; static int lpfc_fcp_imax = LPFC_DEF_IMAX;
module_param(lpfc_fcp_imax, int, S_IRUGO|S_IWUSR); module_param(lpfc_fcp_imax, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(lpfc_fcp_imax, MODULE_PARM_DESC(lpfc_fcp_imax,
"Set the maximum number of fast-path FCP interrupts per second"); "Set the maximum number of FCP interrupts per second per HBA");
lpfc_param_show(fcp_imax) lpfc_param_show(fcp_imax)
/** /**
...@@ -3687,14 +3695,19 @@ lpfc_param_show(fcp_imax) ...@@ -3687,14 +3695,19 @@ lpfc_param_show(fcp_imax)
static int static int
lpfc_fcp_imax_init(struct lpfc_hba *phba, int val) lpfc_fcp_imax_init(struct lpfc_hba *phba, int val)
{ {
if (val >= LPFC_MIM_IMAX && val <= LPFC_DMULT_CONST) { if (phba->sli_rev != LPFC_SLI_REV4) {
phba->cfg_fcp_imax = 0;
return 0;
}
if (val >= LPFC_MIN_IMAX && val <= LPFC_MAX_IMAX) {
phba->cfg_fcp_imax = val; phba->cfg_fcp_imax = val;
return 0; return 0;
} }
lpfc_printf_log(phba, KERN_ERR, LOG_INIT, lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
"3016 fcp_imax: %d out of range, using default\n", val); "3016 fcp_imax: %d out of range, using default\n", val);
phba->cfg_fcp_imax = LPFC_FP_DEF_IMAX; phba->cfg_fcp_imax = LPFC_DEF_IMAX;
return 0; return 0;
} }
......
...@@ -189,9 +189,11 @@ struct lpfc_sli_intf { ...@@ -189,9 +189,11 @@ struct lpfc_sli_intf {
/* Delay Multiplier constant */ /* Delay Multiplier constant */
#define LPFC_DMULT_CONST 651042 #define LPFC_DMULT_CONST 651042
#define LPFC_MIM_IMAX 636
#define LPFC_FP_DEF_IMAX 10000 /* Configuration of Interrupts / sec for entire HBA port */
#define LPFC_SP_DEF_IMAX 10000 #define LPFC_MIN_IMAX 5000
#define LPFC_MAX_IMAX 5000000
#define LPFC_DEF_IMAX 50000
/* PORT_CAPABILITIES constants. */ /* PORT_CAPABILITIES constants. */
#define LPFC_MAX_SUPPORTED_PAGES 8 #define LPFC_MAX_SUPPORTED_PAGES 8
......
...@@ -6927,7 +6927,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) ...@@ -6927,7 +6927,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
goto out_destroy_hba_eq; goto out_destroy_hba_eq;
} }
rc = lpfc_eq_create(phba, phba->sli4_hba.hba_eq[fcp_eqidx], rc = lpfc_eq_create(phba, phba->sli4_hba.hba_eq[fcp_eqidx],
phba->cfg_fcp_imax); (phba->cfg_fcp_imax / phba->cfg_fcp_io_channel));
if (rc) { if (rc) {
lpfc_printf_log(phba, KERN_ERR, LOG_INIT, lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
"0523 Failed setup of fast-path EQ " "0523 Failed setup of fast-path EQ "
......
...@@ -12079,7 +12079,8 @@ lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq) ...@@ -12079,7 +12079,8 @@ lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq)
eq_delay = &mbox->u.mqe.un.eq_delay; eq_delay = &mbox->u.mqe.un.eq_delay;
/* Calculate delay multiper from maximum interrupt per second */ /* Calculate delay multiper from maximum interrupt per second */
dmult = LPFC_DMULT_CONST/phba->cfg_fcp_imax - 1; dmult = phba->cfg_fcp_imax / phba->cfg_fcp_io_channel;
dmult = LPFC_DMULT_CONST/dmult - 1;
cnt = 0; cnt = 0;
for (fcp_eqidx = startq; fcp_eqidx < phba->cfg_fcp_io_channel; for (fcp_eqidx = startq; fcp_eqidx < phba->cfg_fcp_io_channel;
......
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