diff options
| author | Justin Tee <justin.tee@broadcom.com> | 2024-10-31 15:32:16 -0700 | 
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2024-11-02 21:45:24 -0400 | 
| commit | 32566a6f1ae558d0e79fed6e17a75c253367a57f (patch) | |
| tree | 539deb5415c866ce40e11cf2488155399c3d25c2 /drivers/scsi/lpfc/lpfc_sli.c | |
| parent | 4281f44ea8bfedd25938a0031bebba1473ece9ad (diff) | |
scsi: lpfc: Remove NLP_RELEASE_RPI flag from nodelist structure
An RPI is tightly bound to an NDLP structure and is freed only upon
release of an NDLP object.  As such, there should be no logic that frees
an RPI outside of the lpfc_nlp_release() routine.  In order to reinforce
the original design usage of RPIs, remove the NLP_RELEASE_RPI flag and
related logic.
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20241031223219.152342-9-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 48 | 
1 files changed, 17 insertions, 31 deletions
| diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 5ad5ff10256b..c1ce05646e72 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -2844,27 +2844,6 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)  	return;  } -static void -__lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) -{ -	unsigned long iflags; - -	if (ndlp->nlp_flag & NLP_RELEASE_RPI) { -		lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); -		spin_lock_irqsave(&ndlp->lock, iflags); -		ndlp->nlp_flag &= ~NLP_RELEASE_RPI; -		ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; -		spin_unlock_irqrestore(&ndlp->lock, iflags); -	} -	ndlp->nlp_flag &= ~NLP_UNREG_INP; -} - -void -lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) -{ -	__lpfc_sli_rpi_release(vport, ndlp); -} -  /**   * lpfc_sli_def_mbox_cmpl - Default mailbox completion handler   * @phba: Pointer to HBA context object. @@ -2944,8 +2923,6 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)  				ndlp->nlp_flag &= ~NLP_UNREG_INP;  				ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING;  				lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); -			} else { -				__lpfc_sli_rpi_release(vport, ndlp);  			}  			/* The unreg_login mailbox is complete and had a @@ -2993,6 +2970,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)  {  	struct lpfc_vport  *vport = pmb->vport;  	struct lpfc_nodelist *ndlp; +	u32 unreg_inp;  	ndlp = pmb->ctx_ndlp;  	if (pmb->u.mb.mbxCommand == MBX_UNREG_LOGIN) { @@ -3011,14 +2989,22 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)  					 ndlp->nlp_DID, ndlp->nlp_defer_did,  					 ndlp->nlp_flag,  					 ndlp); -				ndlp->nlp_flag &= ~NLP_LOGO_ACC; + +				/* Cleanup the nlp_flag now that the UNREG RPI +				 * has completed. +				 */ +				spin_lock_irq(&ndlp->lock); +				unreg_inp = ndlp->nlp_flag & NLP_UNREG_INP; +				ndlp->nlp_flag &= +					~(NLP_UNREG_INP | NLP_LOGO_ACC); +				spin_unlock_irq(&ndlp->lock);  				/* Check to see if there are any deferred  				 * events to process  				 */ -				if ((ndlp->nlp_flag & NLP_UNREG_INP) && -				    (ndlp->nlp_defer_did != -				    NLP_EVT_NOTHING_PENDING)) { +				if (unreg_inp && +				    ndlp->nlp_defer_did != +				    NLP_EVT_NOTHING_PENDING) {  					lpfc_printf_vlog(  						vport, KERN_INFO,  						LOG_MBOX | LOG_SLI | LOG_NODE, @@ -3027,14 +3013,12 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)  						"NPort x%x Data: x%x x%px\n",  						ndlp->nlp_rpi, ndlp->nlp_DID,  						ndlp->nlp_defer_did, ndlp); -					ndlp->nlp_flag &= ~NLP_UNREG_INP;  					ndlp->nlp_defer_did =  						NLP_EVT_NOTHING_PENDING;  					lpfc_issue_els_plogi(  						vport, ndlp->nlp_DID, 0); -				} else { -					__lpfc_sli_rpi_release(vport, ndlp);  				} +  				lpfc_nlp_put(ndlp);  			}  		} @@ -8752,6 +8736,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)  				lpfc_sli_config_mbox_opcode_get(  					phba, mboxq),  				rc, dd); +  	/*  	 * Allocate all resources (xri,rpi,vpi,vfi) now.  Subsequent  	 * calls depends on these resources to complete port setup. @@ -8764,6 +8749,8 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)  		goto out_free_mbox;  	} +	lpfc_sli4_node_rpi_restore(phba); +  	lpfc_set_host_data(phba, mboxq);  	rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); @@ -8951,7 +8938,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)  		rc = -ENODEV;  		goto out_free_iocblist;  	} -	lpfc_sli4_node_prep(phba);  	if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) {  		if ((phba->nvmet_support == 0) || (phba->cfg_nvmet_mrq == 1)) { | 
