Skip to contentSkip to conversation

lpfc: Fix setting of EQ delay Multiplier

PATCH In review James Smart 2 participants 3 messages Feb 5, 2015 – Feb 16, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 7/21 lpfc: Fix setting of EQ delay Multiplier

---
 drivers/scsi/lpfc/lpfc_init.c | 8 ++++++++
 drivers/scsi/lpfc/lpfc_sli.c  | 9 +++------
 drivers/scsi/lpfc/lpfc_sli4.h | 2 +-
 3 files changed, 12 insertions(+), 7 deletions(-)
drivers/scsi/lpfc/lpfc_init.c +8 -0
index 74672e0..e01619c 100644
@@ -7721,6 +7721,14 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
 			goto out_destroy_els_rq;
 		}
 	}
+
+	/*
+	 * Configure EQ delay multipier for interrupt coalescing using
+	 * MODIFY_EQ_DELAY for all EQs created, LPFC_MAX_EQ_DELAY at a time.
+	 */
+	for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_io_channel;
+			fcp_eqidx += LPFC_MAX_EQ_DELAY)
+		lpfc_modify_fcp_eq_delay(phba, fcp_eqidx);
 	return 0;
 
 out_destroy_els_rq:
drivers/scsi/lpfc/lpfc_sli.c +3 -6
index 207a43d..303b231 100644
@@ -12842,7 +12842,7 @@ lpfc_dual_chute_pci_bar_map(struct lpfc_hba *phba, uint16_t pci_barset)
  * fails this function will return -ENXIO.
  **/
 int
-lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq)
+lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint32_t startq)
 {
 	struct lpfc_mbx_modify_eq_delay *eq_delay;
 	LPFC_MBOXQ_t *mbox;
@@ -12959,11 +12959,8 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint32_t imax)
 	bf_set(lpfc_eq_context_size, &eq_create->u.request.context,
 	       LPFC_EQE_SIZE);
 	bf_set(lpfc_eq_context_valid, &eq_create->u.request.context, 1);
-	/* Calculate delay multiper from maximum interrupt per second */
-	if (imax > LPFC_DMULT_CONST)
-		dmult = 0;
-	else
-		dmult = LPFC_DMULT_CONST/imax - 1;
+	/* don't setup delay multiplier using EQ_CREATE */
+	dmult = 0;
 	bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context,
 	       dmult);
 	switch (eq->entry_count) {
drivers/scsi/lpfc/lpfc_sli4.h +1 -1
index 22ceb2b..935b8eb 100644
@@ -671,7 +671,7 @@ struct lpfc_queue *lpfc_sli4_queue_alloc(struct lpfc_hba *, uint32_t,
 			uint32_t);
 void lpfc_sli4_queue_free(struct lpfc_queue *);
 int lpfc_eq_create(struct lpfc_hba *, struct lpfc_queue *, uint32_t);
-int lpfc_modify_fcp_eq_delay(struct lpfc_hba *, uint16_t);
+int lpfc_modify_fcp_eq_delay(struct lpfc_hba *, uint32_t);
 int lpfc_cq_create(struct lpfc_hba *, struct lpfc_queue *,
 			struct lpfc_queue *, uint32_t, uint32_t);
 int32_t lpfc_mq_create(struct lpfc_hba *, struct lpfc_queue *,
Signature · 4 lines
1.7.11.7

Signed-off-by: James Smart <[email protected]>
Signed-off-by: Dick Kennedy <[email protected]>
#1 lore raw
Quoted 41 lines · James Smart
---
 drivers/scsi/lpfc/lpfc_init.c | 8 ++++++++
 drivers/scsi/lpfc/lpfc_sli.c  | 9 +++------
 drivers/scsi/lpfc/lpfc_sli4.h | 2 +-
 3 files changed, 12 insertions(+), 7 deletions(-)
drivers/scsi/lpfc/lpfc_init.c +8 -0
index 74672e0..e01619c 100644
@@ -7721,6 +7721,14 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
 			goto out_destroy_els_rq;
 		}
 	}
+
+	/*
+	 * Configure EQ delay multipier for interrupt coalescing using
+	 * MODIFY_EQ_DELAY for all EQs created, LPFC_MAX_EQ_DELAY at a time.
+	 */
+	for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_io_channel;
+			fcp_eqidx += LPFC_MAX_EQ_DELAY)
+		lpfc_modify_fcp_eq_delay(phba, fcp_eqidx);
 	return 0;
 
 out_destroy_els_rq:
drivers/scsi/lpfc/lpfc_sli.c +1 -1
index 207a43d..303b231 100644
@@ -12842,7 +12842,7 @@ lpfc_dual_chute_pci_bar_map(struct lpfc_hba *phba, uint16_t pci_barset)
  * fails this function will return -ENXIO.
  **/
 int
-lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq)
+lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint32_t startq)
 {
 	struct lpfc_mbx_modify_eq_delay *eq_delay;
 	LPFC_MBOXQ_t *mbox;
@@ -12959,11 +12959,8 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint32_t imax)
 	bf_set(lpfc_eq_context_size, &eq_create->u.request.context,
 	       LPFC_EQE_SIZE);

drivers/scsi/lpfc/lpfc_sli.c lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint32_t imax) · line 12965

Quoted 10 lines
drivers/scsi/lpfc/lpfc_sli.c +2 -5
 	bf_set(lpfc_eq_context_valid, &eq_create->u.request.context, 1);
-	/* Calculate delay multiper from maximum interrupt per second */
-	if (imax > LPFC_DMULT_CONST)
-		dmult = 0;
-	else
-		dmult = LPFC_DMULT_CONST/imax - 1;
+	/* don't setup delay multiplier using EQ_CREATE */
+	dmult = 0;
 	bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context,
 	       dmult);

This is the only use of 'dmult' in this function, please remove the variable completely
and use this instead - bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context, 0);
Thanks, Tomas

Quoted 14 lines
drivers/scsi/lpfc/lpfc_sli.c +0 -0
 	switch (eq->entry_count) {
drivers/scsi/lpfc/lpfc_sli4.h +1 -1
index 22ceb2b..935b8eb 100644
@@ -671,7 +671,7 @@ struct lpfc_queue *lpfc_sli4_queue_alloc(struct lpfc_hba *, uint32_t,
 			uint32_t);
 void lpfc_sli4_queue_free(struct lpfc_queue *);
 int lpfc_eq_create(struct lpfc_hba *, struct lpfc_queue *, uint32_t);
-int lpfc_modify_fcp_eq_delay(struct lpfc_hba *, uint16_t);
+int lpfc_modify_fcp_eq_delay(struct lpfc_hba *, uint32_t);
 int lpfc_cq_create(struct lpfc_hba *, struct lpfc_queue *,
 			struct lpfc_queue *, uint32_t, uint32_t);
 int32_t lpfc_mq_create(struct lpfc_hba *, struct lpfc_queue *,
#2 lore raw

Tomas,

This one I'm going to leave as is. bf_set is a macro and I'd prefer we kept the variable with a real data type and not be subject to any compiler-based type conversions in the equations. I'd rather not risk any disruption to the macro to add all the paren'd type declarations.

-- james

Quoted 18 lines · Tomas Henzl
drivers/scsi/lpfc/lpfc_sli.c +2 -5
@@ -12959,11 +12959,8 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint32_t imax)
  	bf_set(lpfc_eq_context_size, &eq_create->u.request.context,
  	       LPFC_EQE_SIZE);
  	bf_set(lpfc_eq_context_valid, &eq_create->u.request.context, 1);
-	/* Calculate delay multiper from maximum interrupt per second */
-	if (imax > LPFC_DMULT_CONST)
-		dmult = 0;
-	else
-		dmult = LPFC_DMULT_CONST/imax - 1;
+	/* don't setup delay multiplier using EQ_CREATE */
+	dmult = 0;
  	bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context,
  	       dmult);

This is the only use of 'dmult' in this function, please remove the variable completely
and use this instead - bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context, 0);
Thanks, Tomas