diff mbox series

[3/3] lpfc: access nvme nodelist through nvme rport structure

Message ID 20191018075010.55653-4-hare@suse.de (mailing list archive)
State Changes Requested
Headers show
Series lpfc: nodelist pointer cleanup | expand

Commit Message

Hannes Reinecke Oct. 18, 2019, 7:50 a.m. UTC
Instead of referencing the nodelist directly via a point in the
I/O buffer we should be storing the nvme rport pointer in the
protocol-specific section and access the nodelist through that.
With this we reduce the size of the I/O buffer, eliminate a possible
race and align the protoco-specific sections.

Signed-off-by: Hannes Reinecke <hare@suse.com>
---
 drivers/scsi/lpfc/lpfc_nvme.c | 14 ++++++++------
 drivers/scsi/lpfc/lpfc_sli.h  |  2 +-
 2 files changed, 9 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c
index defb19cdc7fe..80a58003b6aa 100644
--- a/drivers/scsi/lpfc/lpfc_nvme.c
+++ b/drivers/scsi/lpfc/lpfc_nvme.c
@@ -1056,7 +1056,7 @@  lpfc_nvme_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
 	 * Catch race where our node has transitioned, but the
 	 * transport is still transitioning.
 	 */
-	ndlp = lpfc_ncmd->ndlp;
+	ndlp = lpfc_ncmd->nvme.rport->ndlp;
 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
 		lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_IOERR,
 				 "6062 Ignoring NVME cmpl.  No ndlp\n");
@@ -1695,7 +1695,7 @@  lpfc_nvme_fcp_io_submit(struct nvme_fc_local_port *pnvme_lport,
 	 */
 	freqpriv->nvme_buf = lpfc_ncmd;
 	lpfc_ncmd->nvme.nvmeCmd = pnvme_fcreq;
-	lpfc_ncmd->ndlp = ndlp;
+	lpfc_ncmd->nvme.rport = rport;
 	lpfc_ncmd->nvme.qidx = lpfc_queue_info->qidx;
 
 	/*
@@ -2085,11 +2085,13 @@  lpfc_release_nvme_buf(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_ncmd)
 {
 	struct lpfc_sli4_hdw_queue *qp;
 	unsigned long iflag = 0;
+	struct lpfc_nodelist *ndlp =
+	    lpfc_ncmd->nvme.rport ? lpfc_ncmd->nvme.rport->ndlp : NULL;
 
-	if ((lpfc_ncmd->flags & LPFC_SBUF_BUMP_QDEPTH) && lpfc_ncmd->ndlp)
-		atomic_dec(&lpfc_ncmd->ndlp->cmd_pending);
+	if ((lpfc_ncmd->flags & LPFC_SBUF_BUMP_QDEPTH) && ndlp)
+		atomic_dec(&ndlp->cmd_pending);
 
-	lpfc_ncmd->ndlp = NULL;
+	lpfc_ncmd->nvme.rport = NULL;
 	lpfc_ncmd->flags &= ~LPFC_SBUF_BUMP_QDEPTH;
 
 	qp = lpfc_ncmd->hdwq;
@@ -2646,7 +2648,7 @@  lpfc_sli4_nvme_xri_aborted(struct lpfc_hba *phba,
 {
 	uint16_t xri = bf_get(lpfc_wcqe_xa_xri, axri);
 	struct nvmefc_fcp_req *nvme_cmd = NULL;
-	struct lpfc_nodelist *ndlp = lpfc_ncmd->ndlp;
+	struct lpfc_nodelist *ndlp = lpfc_ncmd->nvme.rport->ndlp;
 
 
 	if (ndlp)
diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h
index f0c51288b10a..bb499904bdb6 100644
--- a/drivers/scsi/lpfc/lpfc_sli.h
+++ b/drivers/scsi/lpfc/lpfc_sli.h
@@ -382,7 +382,6 @@  struct lpfc_io_buf {
 	uint16_t hdwq_no;
 	uint16_t cpu;
 
-	struct lpfc_nodelist *ndlp;
 	uint32_t timeout;
 	uint16_t flags;  /* TBD convert exch_busy to flags */
 #define LPFC_SBUF_XBUSY		0x1	/* SLI4 hba reported XB on WCQE cmpl */
@@ -439,6 +438,7 @@  struct lpfc_io_buf {
 		/* NVME specific fields */
 		struct {
 			struct nvmefc_fcp_req *nvmeCmd;
+			struct lpfc_nvme_rport *rport;
 			uint16_t qidx;
 		} nvme;
 	};