[SCSI] lpfc 8.3.33: Allow per-hba interrupt rate tuning
authorJames Smart <james.smart@emulex.com>
Fri, 3 Aug 2012 16:36:24 +0000 (12:36 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 14 Sep 2012 13:42:12 +0000 (14:42 +0100)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c

index 2910208b5dfa7abf5a65113b19dd00c44990d514..f7c5531d984cc96f565fa9e064bc425f62d709e9 100644 (file)
@@ -3643,14 +3643,21 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
        struct lpfc_hba *phba = vport->phba;
        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 */
        if (!isdigit(buf[0]))
                return -EINVAL;
        if (sscanf(buf, "%i", &val) != 1)
                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;
 
        phba->cfg_fcp_imax = (uint32_t)val;
@@ -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
+# 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_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)
 
 /**
@@ -3687,14 +3695,19 @@ lpfc_param_show(fcp_imax)
 static int
 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;
                return 0;
        }
 
        lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                        "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;
 }
index 9f5c93c5fda36c418eb9e23091b5bd9e0e7d44f1..821262d2cf76d80224ab28825c60255d4a149233 100644 (file)
@@ -189,9 +189,11 @@ struct lpfc_sli_intf {
 
 /* Delay Multiplier constant */
 #define LPFC_DMULT_CONST       651042
-#define LPFC_MIM_IMAX          636
-#define LPFC_FP_DEF_IMAX       10000
-#define LPFC_SP_DEF_IMAX       10000
+
+/* Configuration of Interrupts / sec for entire HBA port */
+#define LPFC_MIN_IMAX          5000
+#define LPFC_MAX_IMAX          5000000
+#define LPFC_DEF_IMAX          50000
 
 /* PORT_CAPABILITIES constants. */
 #define LPFC_MAX_SUPPORTED_PAGES       8
index 164aa87734b83519494def301de4b59fbe612b89..3dad5ff870a8581e8a740d8bb0127574fae952fb 100644 (file)
@@ -6927,7 +6927,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
                        goto out_destroy_hba_eq;
                }
                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) {
                        lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                        "0523 Failed setup of fast-path EQ "
index 8cbbd815c0309012e31f5b9c15d417843d4b0eb3..0d5dab3da964655e0de35cb8b179ba244912e7b0 100644 (file)
@@ -12079,7 +12079,8 @@ lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq)
        eq_delay = &mbox->u.mqe.un.eq_delay;
 
        /* 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;
        for (fcp_eqidx = startq; fcp_eqidx < phba->cfg_fcp_io_channel;