Blame SOURCES/0121-scsi-scsi-qla2xxx-cleanup-trace-buffer-initializatio.patch

3d7c23
From c4057d8b60cf06e57bee74fb596f64291803852e Mon Sep 17 00:00:00 2001
3d7c23
From: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Date: Wed, 4 Sep 2019 21:04:19 -0400
3d7c23
Subject: [PATCH 121/124] [scsi] scsi: qla2xxx: cleanup trace buffer
3d7c23
 initialization
3d7c23
3d7c23
Message-id: <20190904210419.3503-3-hmadhani@redhat.com>
3d7c23
Patchwork-id: 270922
3d7c23
O-Subject: [RHEL7.8 e-stor PATCH 2/2] scsi: qla2xxx: cleanup trace buffer initialization
3d7c23
Bugzilla: 1749039
3d7c23
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
3d7c23
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
3d7c23
RH-Acked-by: Maurizio Lombardi <mlombard@redhat.com>
3d7c23
RH-Acked-by: Ewan Milne <emilne@redhat.com>
3d7c23
3d7c23
From: Martin Wilck <mwilck@suse.com>
3d7c23
3d7c23
Bugzilla 1749039
3d7c23
3d7c23
Avoid code duplication between qla2x00_alloc_offload_mem() and
3d7c23
qla2x00_alloc_fw_dump() by moving the FCE and EFT buffer allocation and
3d7c23
initialization to separate functions. Cleanly track failure and success by
3d7c23
making sure that the ha->eft, ha->fce and respective eft_dma, fce_dma
3d7c23
members are set if and only if the buffers are properly allocated and
3d7c23
initialized. Avoid pointless buffer reallocation.  Eliminate some goto
3d7c23
statements. Make sure the fce_enabled flag is cleared when the FCE buffer
3d7c23
is freed.
3d7c23
3d7c23
Fixes: ad0a0b01f088 ("scsi: qla2xxx: Fix Firmware dump size for Extended login and Exchange Offload")
3d7c23
Fixes: a28d9e4ef997 ("scsi: qla2xxx: Add support for multiple fwdump templates/segments")
3d7c23
Cc: Joe Carnuccio <joe.carnuccio@cavium.com>
3d7c23
Cc: Quinn Tran <qutran@marvell.com>
3d7c23
Cc: Himanshu Madhani <hmadhani@marvell.com>
3d7c23
Cc: Bart Van Assche <bvanassche@acm.org>
3d7c23
Signed-off-by: Martin Wilck <mwilck@suse.com>
3d7c23
Tested-by: Himanshu Madhani <hmadhani@marvell.com>
3d7c23
Reviewed-by: Himanshu Madhani <hmadhani@marvell.com>
3d7c23
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
3d7c23
(cherry picked from commit 3cf92f4bfccbb3e378cd86dc46e09c2bc18cda26)
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Signed-off-by: Jan Stancek <jstancek@redhat.com>
3d7c23
---
3d7c23
 drivers/scsi/qla2xxx/qla_init.c | 216 ++++++++++++++++++----------------------
3d7c23
 drivers/scsi/qla2xxx/qla_os.c   |   1 +
3d7c23
 2 files changed, 100 insertions(+), 117 deletions(-)
3d7c23
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
3d7c23
index 52d336706349..4ca6fc8dce63 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_init.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_init.c
3d7c23
@@ -3113,103 +3113,113 @@ qla24xx_chip_diag(scsi_qla_host_t *vha)
3d7c23
 }
3d7c23
 
3d7c23
 static void
3d7c23
-qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
3d7c23
+qla2x00_init_fce_trace(scsi_qla_host_t *vha)
3d7c23
 {
3d7c23
 	int rval;
3d7c23
 	dma_addr_t tc_dma;
3d7c23
 	void *tc;
3d7c23
 	struct qla_hw_data *ha = vha->hw;
3d7c23
 
3d7c23
-	if (ha->eft) {
3d7c23
+	if (!IS_FWI2_CAPABLE(ha))
3d7c23
+		return;
3d7c23
+
3d7c23
+	if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3d7c23
+	    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
3d7c23
+		return;
3d7c23
+
3d7c23
+	if (ha->fce) {
3d7c23
 		ql_dbg(ql_dbg_init, vha, 0x00bd,
3d7c23
-		    "%s: Offload Mem is already allocated.\n",
3d7c23
-		    __func__);
3d7c23
+		       "%s: FCE Mem is already allocated.\n",
3d7c23
+		       __func__);
3d7c23
 		return;
3d7c23
 	}
3d7c23
 
3d7c23
-	if (IS_FWI2_CAPABLE(ha)) {
3d7c23
-		/* Allocate memory for Fibre Channel Event Buffer. */
3d7c23
-		if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3d7c23
-		    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
3d7c23
-			goto try_eft;
3d7c23
+	/* Allocate memory for Fibre Channel Event Buffer. */
3d7c23
+	tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma,
3d7c23
+				GFP_KERNEL);
3d7c23
+	if (!tc) {
3d7c23
+		ql_log(ql_log_warn, vha, 0x00be,
3d7c23
+		       "Unable to allocate (%d KB) for FCE.\n",
3d7c23
+		       FCE_SIZE / 1024);
3d7c23
+		return;
3d7c23
+	}
3d7c23
 
3d7c23
-		if (ha->fce)
3d7c23
-			dma_free_coherent(&ha->pdev->dev,
3d7c23
-			    FCE_SIZE, ha->fce, ha->fce_dma);
3d7c23
-
3d7c23
-		/* Allocate memory for Fibre Channel Event Buffer. */
3d7c23
-		tc = dma_zalloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma,
3d7c23
-					GFP_KERNEL);
3d7c23
-		if (!tc) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00be,
3d7c23
-			    "Unable to allocate (%d KB) for FCE.\n",
3d7c23
-			    FCE_SIZE / 1024);
3d7c23
-			goto try_eft;
3d7c23
-		}
3d7c23
-
3d7c23
-		rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS,
3d7c23
-		    ha->fce_mb, &ha->fce_bufs);
3d7c23
-		if (rval) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00bf,
3d7c23
-			    "Unable to initialize FCE (%d).\n", rval);
3d7c23
-			dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc,
3d7c23
-			    tc_dma);
3d7c23
-			ha->flags.fce_enabled = 0;
3d7c23
-			goto try_eft;
3d7c23
-		}
3d7c23
-		ql_dbg(ql_dbg_init, vha, 0x00c0,
3d7c23
-		    "Allocate (%d KB) for FCE...\n", FCE_SIZE / 1024);
3d7c23
-
3d7c23
-		ha->flags.fce_enabled = 1;
3d7c23
-		ha->fce_dma = tc_dma;
3d7c23
-		ha->fce = tc;
3d7c23
-
3d7c23
-try_eft:
3d7c23
-		if (ha->eft)
3d7c23
-			dma_free_coherent(&ha->pdev->dev,
3d7c23
-			    EFT_SIZE, ha->eft, ha->eft_dma);
3d7c23
+	rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS,
3d7c23
+					ha->fce_mb, &ha->fce_bufs);
3d7c23
+	if (rval) {
3d7c23
+		ql_log(ql_log_warn, vha, 0x00bf,
3d7c23
+		       "Unable to initialize FCE (%d).\n", rval);
3d7c23
+		dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc, tc_dma);
3d7c23
+		return;
3d7c23
+	}
3d7c23
 
3d7c23
-		/* Allocate memory for Extended Trace Buffer. */
3d7c23
-		tc = dma_zalloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
3d7c23
-					 GFP_KERNEL);
3d7c23
-		if (!tc) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00c1,
3d7c23
-			    "Unable to allocate (%d KB) for EFT.\n",
3d7c23
-			    EFT_SIZE / 1024);
3d7c23
-			goto eft_err;
3d7c23
-		}
3d7c23
+	ql_dbg(ql_dbg_init, vha, 0x00c0,
3d7c23
+	       "Allocated (%d KB) for FCE...\n", FCE_SIZE / 1024);
3d7c23
 
3d7c23
-		rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
3d7c23
-		if (rval) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00c2,
3d7c23
-			    "Unable to initialize EFT (%d).\n", rval);
3d7c23
-			dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
3d7c23
-			    tc_dma);
3d7c23
-			goto eft_err;
3d7c23
-		}
3d7c23
-		ql_dbg(ql_dbg_init, vha, 0x00c3,
3d7c23
-		    "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
3d7c23
+	ha->flags.fce_enabled = 1;
3d7c23
+	ha->fce_dma = tc_dma;
3d7c23
+	ha->fce = tc;
3d7c23
+}
3d7c23
+
3d7c23
+static void
3d7c23
+qla2x00_init_eft_trace(scsi_qla_host_t *vha)
3d7c23
+{
3d7c23
+	int rval;
3d7c23
+	dma_addr_t tc_dma;
3d7c23
+	void *tc;
3d7c23
+	struct qla_hw_data *ha = vha->hw;
3d7c23
+
3d7c23
+	if (!IS_FWI2_CAPABLE(ha))
3d7c23
+		return;
3d7c23
 
3d7c23
-		ha->eft_dma = tc_dma;
3d7c23
-		ha->eft = tc;
3d7c23
+	if (ha->eft) {
3d7c23
+		ql_dbg(ql_dbg_init, vha, 0x00bd,
3d7c23
+		    "%s: EFT Mem is already allocated.\n",
3d7c23
+		    __func__);
3d7c23
+		return;
3d7c23
 	}
3d7c23
 
3d7c23
-eft_err:
3d7c23
-	return;
3d7c23
+	/* Allocate memory for Extended Trace Buffer. */
3d7c23
+	tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
3d7c23
+				GFP_KERNEL);
3d7c23
+	if (!tc) {
3d7c23
+		ql_log(ql_log_warn, vha, 0x00c1,
3d7c23
+		       "Unable to allocate (%d KB) for EFT.\n",
3d7c23
+		       EFT_SIZE / 1024);
3d7c23
+		return;
3d7c23
+	}
3d7c23
+
3d7c23
+	rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
3d7c23
+	if (rval) {
3d7c23
+		ql_log(ql_log_warn, vha, 0x00c2,
3d7c23
+		       "Unable to initialize EFT (%d).\n", rval);
3d7c23
+		dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc, tc_dma);
3d7c23
+		return;
3d7c23
+	}
3d7c23
+
3d7c23
+	ql_dbg(ql_dbg_init, vha, 0x00c3,
3d7c23
+	       "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
3d7c23
+
3d7c23
+	ha->eft_dma = tc_dma;
3d7c23
+	ha->eft = tc;
3d7c23
+}
3d7c23
+
3d7c23
+static void
3d7c23
+qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
3d7c23
+{
3d7c23
+	qla2x00_init_fce_trace(vha);
3d7c23
+	qla2x00_init_eft_trace(vha);
3d7c23
 }
3d7c23
 
3d7c23
 void
3d7c23
 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
3d7c23
 {
3d7c23
-	int rval;
3d7c23
 	uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
3d7c23
 	    eft_size, fce_size, mq_size;
3d7c23
 	struct qla_hw_data *ha = vha->hw;
3d7c23
 	struct req_que *req = ha->req_q_map[0];
3d7c23
 	struct rsp_que *rsp = ha->rsp_q_map[0];
3d7c23
 	struct qla2xxx_fw_dump *fw_dump;
3d7c23
-	dma_addr_t tc_dma;
3d7c23
-	void *tc;
3d7c23
 
3d7c23
 	dump_size = fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
3d7c23
 	req_q_size = rsp_q_size = 0;
3d7c23
@@ -3247,39 +3257,13 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
3d7c23
 		}
3d7c23
 		if (ha->tgt.atio_ring)
3d7c23
 			mq_size += ha->tgt.atio_q_length * sizeof(request_t);
3d7c23
-		/* Allocate memory for Fibre Channel Event Buffer. */
3d7c23
-		if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3d7c23
-		    !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
3d7c23
-			goto try_eft;
3d7c23
 
3d7c23
-		fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
3d7c23
-try_eft:
3d7c23
+		qla2x00_init_fce_trace(vha);
3d7c23
+		if (ha->fce)
3d7c23
+			fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
3d7c23
+		qla2x00_init_eft_trace(vha);
3d7c23
 		if (ha->eft)
3d7c23
-			dma_free_coherent(&ha->pdev->dev,
3d7c23
-			    EFT_SIZE, ha->eft, ha->eft_dma);
3d7c23
-
3d7c23
-		/* Allocate memory for Extended Trace Buffer. */
3d7c23
-		tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
3d7c23
-					 GFP_KERNEL);
3d7c23
-		if (!tc) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00c1,
3d7c23
-			    "Unable to allocate (%d KB) for EFT.\n",
3d7c23
-			    EFT_SIZE / 1024);
3d7c23
-			goto allocate;
3d7c23
-		}
3d7c23
-
3d7c23
-		rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
3d7c23
-		if (rval) {
3d7c23
-			ql_log(ql_log_warn, vha, 0x00c2,
3d7c23
-			    "Unable to initialize EFT (%d).\n", rval);
3d7c23
-			dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
3d7c23
-			    tc_dma);
3d7c23
-		}
3d7c23
-		ql_dbg(ql_dbg_init, vha, 0x00c3,
3d7c23
-		    "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
3d7c23
-		eft_size = EFT_SIZE;
3d7c23
-		ha->eft_dma = tc_dma;
3d7c23
-		ha->eft = tc;
3d7c23
+			eft_size = EFT_SIZE;
3d7c23
 	}
3d7c23
 
3d7c23
 	if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
3d7c23
@@ -3301,24 +3285,22 @@ try_eft:
3d7c23
 			    j, fwdt->dump_size);
3d7c23
 			dump_size += fwdt->dump_size;
3d7c23
 		}
3d7c23
-		goto allocate;
3d7c23
+	} else {
3d7c23
+		req_q_size = req->length * sizeof(request_t);
3d7c23
+		rsp_q_size = rsp->length * sizeof(response_t);
3d7c23
+		dump_size = offsetof(struct qla2xxx_fw_dump, isp);
3d7c23
+		dump_size += fixed_size + mem_size + req_q_size + rsp_q_size
3d7c23
+			+ eft_size;
3d7c23
+		ha->chain_offset = dump_size;
3d7c23
+		dump_size += mq_size + fce_size;
3d7c23
+		if (ha->exchoffld_buf)
3d7c23
+			dump_size += sizeof(struct qla2xxx_offld_chain) +
3d7c23
+				ha->exchoffld_size;
3d7c23
+		if (ha->exlogin_buf)
3d7c23
+			dump_size += sizeof(struct qla2xxx_offld_chain) +
3d7c23
+				ha->exlogin_size;
3d7c23
 	}
3d7c23
 
3d7c23
-	req_q_size = req->length * sizeof(request_t);
3d7c23
-	rsp_q_size = rsp->length * sizeof(response_t);
3d7c23
-	dump_size = offsetof(struct qla2xxx_fw_dump, isp);
3d7c23
-	dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + eft_size;
3d7c23
-	ha->chain_offset = dump_size;
3d7c23
-	dump_size += mq_size + fce_size;
3d7c23
-
3d7c23
-	if (ha->exchoffld_buf)
3d7c23
-		dump_size += sizeof(struct qla2xxx_offld_chain) +
3d7c23
-			ha->exchoffld_size;
3d7c23
-	if (ha->exlogin_buf)
3d7c23
-		dump_size += sizeof(struct qla2xxx_offld_chain) +
3d7c23
-			ha->exlogin_size;
3d7c23
-
3d7c23
-allocate:
3d7c23
 	if (!ha->fw_dump_len || dump_size > ha->fw_dump_alloc_len) {
3d7c23
 
3d7c23
 		ql_dbg(ql_dbg_init, vha, 0x00c5,
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
3d7c23
index 542a97d713cc..0eb37e0a8985 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_os.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_os.c
3d7c23
@@ -4740,6 +4740,7 @@ qla2x00_free_fw_dump(struct qla_hw_data *ha)
3d7c23
 
3d7c23
 	ha->fce = NULL;
3d7c23
 	ha->fce_dma = 0;
3d7c23
+	ha->flags.fce_enabled = 0;
3d7c23
 	ha->eft = NULL;
3d7c23
 	ha->eft_dma = 0;
3d7c23
 	ha->fw_dumped = 0;
3d7c23
-- 
3d7c23
2.13.6
3d7c23