scsi: qla2xxx: edif: Fix I/O timeout due to over-subscription
authorQuinn Tran <qutran@marvell.com>
Wed, 8 Jun 2022 11:58:40 +0000 (04:58 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:39:22 +0000 (09:39 +0100)
[ Upstream commit 63ab6cb582fad3757a03f466db671729b97f2df8 ]

The current edif code does not keep track of FW IOCB resources.  This led
to IOCB queue full on error recovery (I/O timeout).  Make use of the
existing code that tracks IOCB resources to prevent over-subscription.

Link: https://lore.kernel.org/r/20220608115849.16693-2-njavali@marvell.com
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Stable-dep-of: 41e5afe51f75 ("scsi: qla2xxx: Fix exchange oversubscription")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/qla2xxx/qla_edif.c

index 8e9237434e8b1dca681066aab3e1bfd67fcfb65e..a7e2118b3a841c124dcb8c546f3e94fc39289474 100644 (file)
@@ -2898,6 +2898,12 @@ qla28xx_start_scsi_edif(srb_t *sp)
 
        tot_dsds = nseg;
        req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
+
+       sp->iores.res_type = RESOURCE_INI;
+       sp->iores.iocb_cnt = req_cnt;
+       if (qla_get_iocbs(sp->qpair, &sp->iores))
+               goto queuing_error;
+
        if (req->cnt < (req_cnt + 2)) {
                cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr :
                    rd_reg_dword(req->req_q_out);
@@ -3089,6 +3095,7 @@ queuing_error:
                mempool_free(sp->u.scmd.ct6_ctx, ha->ctx_mempool);
                sp->u.scmd.ct6_ctx = NULL;
        }
+       qla_put_iocbs(sp->qpair, &sp->iores);
        spin_unlock_irqrestore(lock, flags);
 
        return QLA_FUNCTION_FAILED;