]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: lpfc: Cancel ELS WQE instead of issuing abort when SLI port is inactive
authorJustin Tee <justin.tee@broadcom.com>
Fri, 28 Jun 2024 17:20:04 +0000 (10:20 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 5 Jul 2024 03:24:51 +0000 (23:24 -0400)
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: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240628172011.25921-2-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_sli.c

index c32bc773ab29de0f4d427a8b42223f6f53e69db0..b27ebb574bfbbb72f4bdb9268cab908ebbe3f23c 100644 (file)
@@ -9665,7 +9665,7 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
        list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
                spin_lock_irqsave(&phba->hbalock, iflags);
                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);
                else
                        lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
index f475e7ece41a4fe9389bad543269c749c95c6591..8bfac9143314713c3e35ff70e6c683ea822d767f 100644 (file)
@@ -12301,18 +12301,16 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                                goto release_iocb;
                        }
                }
-
-               lpfc_printf_log(phba, KERN_WARNING, LOG_ELS | LOG_SLI,
-                               "0327 Cannot abort els iocb x%px "
-                               "with io cmd xri %x abort tag : x%x, "
-                               "abort status %x abort code %x\n",
-                               cmdiocb, get_job_abtsiotag(phba, cmdiocb),
-                               (phba->sli_rev == LPFC_SLI_REV4) ?
-                               get_wqe_reqtag(cmdiocb) :
-                               cmdiocb->iocb.un.acxri.abortContextTag,
-                               ulp_status, ulp_word4);
-
        }
+
+       lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_SLI,
+                       "0327 Abort els iocb complete x%px with io cmd xri %x "
+                       "abort tag x%x abort status %x abort code %x\n",
+                       cmdiocb, get_job_abtsiotag(phba, cmdiocb),
+                       (phba->sli_rev == LPFC_SLI_REV4) ?
+                       get_wqe_reqtag(cmdiocb) :
+                       cmdiocb->iocb.ulpIoTag,
+                       ulp_status, ulp_word4);
 release_iocb:
        lpfc_sli_release_iocbq(phba, cmdiocb);
        return;
@@ -12509,10 +12507,10 @@ abort_iotag_exit:
        lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
                         "0339 Abort IO XRI x%x, Original iotag x%x, "
                         "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) ?
                         cmdiocb->iotag : iotag, iotag, cmdiocb, abtsiocbp,
-                        retval, ia);
+                        retval, ia, abtsiocbp->cmd_cmpl);
        if (retval) {
                cmdiocb->cmd_flag &= ~LPFC_DRIVER_ABORTED;
                __lpfc_sli_release_iocbq(phba, abtsiocbp);