Commit e999ef15 authored by Justin Tee's avatar Justin Tee Committed by Martin K. Petersen

scsi: lpfc: Cancel ELS WQE instead of issuing abort when SLI port is inactive

During SLI port errata events, there should be no expectation that
submitted outstanding WQEs will return back CQEs.  In these situations, the
driver should not rely on receiving CQEs from the SLI port to signal WQE
resource clean up.

Put an sli_flag LPFC_SLI_ACTIVE check in lpfc_els_flush_cmd() when walking
the txcmplq.  The sli_flag check helps determine whether to issue an abort
or driver based cancel on outstanding WQEs.  If !LPFC_SLI_ACTIVE, then
there's no point to issue anything to the SLI port.  Instead, let the
driver based cancel logic clean up the submitted WQE resources.

Also, enhance some abort log messages that help with future debugging.
Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240628172011.25921-2-justintee8345@gmail.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 1613e604
...@@ -9665,7 +9665,7 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport) ...@@ -9665,7 +9665,7 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) { list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
spin_lock_irqsave(&phba->hbalock, iflags); spin_lock_irqsave(&phba->hbalock, iflags);
list_del_init(&piocb->dlist); list_del_init(&piocb->dlist);
if (mbx_tmo_err) if (mbx_tmo_err || !(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
list_move_tail(&piocb->list, &cancel_list); list_move_tail(&piocb->list, &cancel_list);
else else
lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL); lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
......
...@@ -12301,18 +12301,16 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -12301,18 +12301,16 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
goto release_iocb; goto release_iocb;
} }
} }
}
lpfc_printf_log(phba, KERN_WARNING, LOG_ELS | LOG_SLI, lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_SLI,
"0327 Cannot abort els iocb x%px " "0327 Abort els iocb complete x%px with io cmd xri %x "
"with io cmd xri %x abort tag : x%x, " "abort tag x%x abort status %x abort code %x\n",
"abort status %x abort code %x\n",
cmdiocb, get_job_abtsiotag(phba, cmdiocb), cmdiocb, get_job_abtsiotag(phba, cmdiocb),
(phba->sli_rev == LPFC_SLI_REV4) ? (phba->sli_rev == LPFC_SLI_REV4) ?
get_wqe_reqtag(cmdiocb) : get_wqe_reqtag(cmdiocb) :
cmdiocb->iocb.un.acxri.abortContextTag, cmdiocb->iocb.ulpIoTag,
ulp_status, ulp_word4); ulp_status, ulp_word4);
}
release_iocb: release_iocb:
lpfc_sli_release_iocbq(phba, cmdiocb); lpfc_sli_release_iocbq(phba, cmdiocb);
return; return;
...@@ -12509,10 +12507,10 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -12509,10 +12507,10 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI, lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
"0339 Abort IO XRI x%x, Original iotag x%x, " "0339 Abort IO XRI x%x, Original iotag x%x, "
"abort tag x%x Cmdjob : x%px Abortjob : x%px " "abort tag x%x Cmdjob : x%px Abortjob : x%px "
"retval x%x : IA %d\n", "retval x%x : IA %d cmd_cmpl %ps\n",
ulp_context, (phba->sli_rev == LPFC_SLI_REV4) ? ulp_context, (phba->sli_rev == LPFC_SLI_REV4) ?
cmdiocb->iotag : iotag, iotag, cmdiocb, abtsiocbp, cmdiocb->iotag : iotag, iotag, cmdiocb, abtsiocbp,
retval, ia); retval, ia, abtsiocbp->cmd_cmpl);
if (retval) { if (retval) {
cmdiocb->cmd_flag &= ~LPFC_DRIVER_ABORTED; cmdiocb->cmd_flag &= ~LPFC_DRIVER_ABORTED;
__lpfc_sli_release_iocbq(phba, abtsiocbp); __lpfc_sli_release_iocbq(phba, abtsiocbp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment