scsi: qla2xxx: Delay I/O Abort on PCI error
authorQuinn Tran <qutran@marvell.com>
Tue, 27 Feb 2024 16:41:26 +0000 (22:11 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sun, 10 Mar 2024 22:44:44 +0000 (18:44 -0400)
Currently when PCI error is detected, I/O is aborted manually through the
ABORT IOCB mechanism which is not guaranteed to succeed.

Instead, wait for the OS or system to notify driver to wind down I/O
through the pci_error_handlers api.  Set eeh_busy flag to pause all traffic
and wait for I/O to drain.

Cc: stable@vger.kernel.org
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Link: https://lore.kernel.org/r/20240227164127.36465-11-njavali@marvell.com
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_attr.c

index 44449c70a375f34feff9c97df33044831bb7bbc8..76eeba435fd0469f4f32cfbbda1720fad2a44255 100644 (file)
@@ -2741,7 +2741,13 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
                return;
 
        if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
-               qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
+               /* Will wait for wind down of adapter */
+               ql_dbg(ql_dbg_aer, fcport->vha, 0x900c,
+                   "%s pci offline detected (id %06x)\n", __func__,
+                   fcport->d_id.b24);
+               qla_pci_set_eeh_busy(fcport->vha);
+               qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24,
+                   0, WAIT_TARGET);
                return;
        }
 }
@@ -2763,7 +2769,11 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
        vha = fcport->vha;
 
        if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
-               qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
+               /* Will wait for wind down of adapter */
+               ql_dbg(ql_dbg_aer, fcport->vha, 0x900b,
+                   "%s pci offline detected (id %06x)\n", __func__,
+                   fcport->d_id.b24);
+               qla_pci_set_eeh_busy(vha);
                qla2x00_eh_wait_for_pending_commands(fcport->vha, fcport->d_id.b24,
                        0, WAIT_TARGET);
                return;