|
|
3c6e85 |
From dd167cef787e435604d9553b022a8328b8c167dc Mon Sep 17 00:00:00 2001
|
|
|
3c6e85 |
From: Himanshu Madhani <hmadhani@redhat.com>
|
|
|
3c6e85 |
Date: Thu, 1 Aug 2019 15:54:26 -0400
|
|
|
3c6e85 |
Subject: [PATCH 006/124] [scsi] scsi: qla2xxx: Fix session cleanup hang
|
|
|
3c6e85 |
|
|
|
3c6e85 |
Message-id: <20190801155618.12650-7-hmadhani@redhat.com>
|
|
|
3c6e85 |
Patchwork-id: 267790
|
|
|
3c6e85 |
O-Subject: [RHEL 7.8 e-stor PATCH 006/118] scsi: qla2xxx: Fix session cleanup hang
|
|
|
3c6e85 |
Bugzilla: 1729270
|
|
|
3c6e85 |
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
|
3c6e85 |
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
|
3c6e85 |
|
|
|
3c6e85 |
From: Quinn Tran <quinn.tran@cavium.com>
|
|
|
3c6e85 |
|
|
|
3c6e85 |
Bugzilla 1729270
|
|
|
3c6e85 |
|
|
|
3c6e85 |
On session cleanup, either an implicit LOGO or an implicit PRLO is used to
|
|
|
3c6e85 |
flush IOs. If the flush command hit Queue Full condition, then it is
|
|
|
3c6e85 |
dropped. This patch adds retry code to prevent command drop.
|
|
|
3c6e85 |
|
|
|
3c6e85 |
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
|
|
|
3c6e85 |
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
|
|
|
3c6e85 |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
|
3c6e85 |
(cherry picked from commit 80676d054e5a945f8192802b68093764fbf3c5fc)
|
|
|
3c6e85 |
Signed-off-by: Himanshu Madhani <hmadhani@redhat.com>
|
|
|
3c6e85 |
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
|
3c6e85 |
---
|
|
|
3c6e85 |
drivers/scsi/qla2xxx/qla_iocb.c | 5 ++---
|
|
|
3c6e85 |
drivers/scsi/qla2xxx/qla_os.c | 17 +++++++++++++----
|
|
|
3c6e85 |
2 files changed, 15 insertions(+), 7 deletions(-)
|
|
|
3c6e85 |
|
|
|
3c6e85 |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
|
|
|
3c6e85 |
index b0ab5d362f64..348d9d3bf590 100644
|
|
|
3c6e85 |
--- a/drivers/scsi/qla2xxx/qla_iocb.c
|
|
|
3c6e85 |
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
|
|
|
3c6e85 |
@@ -3716,23 +3716,22 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx *logio)
|
|
|
3c6e85 |
int
|
|
|
3c6e85 |
qla2x00_start_sp(srb_t *sp)
|
|
|
3c6e85 |
{
|
|
|
3c6e85 |
- int rval;
|
|
|
3c6e85 |
+ int rval = QLA_SUCCESS;
|
|
|
3c6e85 |
scsi_qla_host_t *vha = sp->vha;
|
|
|
3c6e85 |
struct qla_hw_data *ha = vha->hw;
|
|
|
3c6e85 |
struct qla_qpair *qp = sp->qpair;
|
|
|
3c6e85 |
void *pkt;
|
|
|
3c6e85 |
unsigned long flags;
|
|
|
3c6e85 |
|
|
|
3c6e85 |
- rval = QLA_FUNCTION_FAILED;
|
|
|
3c6e85 |
spin_lock_irqsave(qp->qp_lock_ptr, flags);
|
|
|
3c6e85 |
pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
|
|
|
3c6e85 |
if (!pkt) {
|
|
|
3c6e85 |
+ rval = EAGAIN;
|
|
|
3c6e85 |
ql_log(ql_log_warn, vha, 0x700c,
|
|
|
3c6e85 |
"qla2x00_alloc_iocbs failed.\n");
|
|
|
3c6e85 |
goto done;
|
|
|
3c6e85 |
}
|
|
|
3c6e85 |
|
|
|
3c6e85 |
- rval = QLA_SUCCESS;
|
|
|
3c6e85 |
switch (sp->type) {
|
|
|
3c6e85 |
case SRB_LOGIN_CMD:
|
|
|
3c6e85 |
IS_FWI2_CAPABLE(ha) ?
|
|
|
3c6e85 |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
|
|
|
3c6e85 |
index 399a9072ae02..ee09796b9847 100644
|
|
|
3c6e85 |
--- a/drivers/scsi/qla2xxx/qla_os.c
|
|
|
3c6e85 |
+++ b/drivers/scsi/qla2xxx/qla_os.c
|
|
|
3c6e85 |
@@ -5298,14 +5298,14 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|
|
3c6e85 |
struct qla_work_evt *e, *tmp;
|
|
|
3c6e85 |
unsigned long flags;
|
|
|
3c6e85 |
LIST_HEAD(work);
|
|
|
3c6e85 |
+ int rc;
|
|
|
3c6e85 |
|
|
|
3c6e85 |
spin_lock_irqsave(&vha->work_lock, flags);
|
|
|
3c6e85 |
list_splice_init(&vha->work_list, &work);
|
|
|
3c6e85 |
spin_unlock_irqrestore(&vha->work_lock, flags);
|
|
|
3c6e85 |
|
|
|
3c6e85 |
list_for_each_entry_safe(e, tmp, &work, list) {
|
|
|
3c6e85 |
- list_del_init(&e->list);
|
|
|
3c6e85 |
-
|
|
|
3c6e85 |
+ rc = QLA_SUCCESS;
|
|
|
3c6e85 |
switch (e->type) {
|
|
|
3c6e85 |
case QLA_EVT_AEN:
|
|
|
3c6e85 |
fc_host_post_event(vha->host, fc_get_event_number(),
|
|
|
3c6e85 |
@@ -5319,7 +5319,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|
|
3c6e85 |
e->u.logio.data);
|
|
|
3c6e85 |
break;
|
|
|
3c6e85 |
case QLA_EVT_ASYNC_LOGOUT:
|
|
|
3c6e85 |
- qla2x00_async_logout(vha, e->u.logio.fcport);
|
|
|
3c6e85 |
+ rc = qla2x00_async_logout(vha, e->u.logio.fcport);
|
|
|
3c6e85 |
break;
|
|
|
3c6e85 |
case QLA_EVT_ASYNC_LOGOUT_DONE:
|
|
|
3c6e85 |
qla2x00_async_logout_done(vha, e->u.logio.fcport,
|
|
|
3c6e85 |
@@ -5364,7 +5364,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|
|
3c6e85 |
qla24xx_do_nack_work(vha, e);
|
|
|
3c6e85 |
break;
|
|
|
3c6e85 |
case QLA_EVT_ASYNC_PRLO:
|
|
|
3c6e85 |
- qla2x00_async_prlo(vha, e->u.logio.fcport);
|
|
|
3c6e85 |
+ rc = qla2x00_async_prlo(vha, e->u.logio.fcport);
|
|
|
3c6e85 |
break;
|
|
|
3c6e85 |
case QLA_EVT_ASYNC_PRLO_DONE:
|
|
|
3c6e85 |
qla2x00_async_prlo_done(vha, e->u.logio.fcport,
|
|
|
3c6e85 |
@@ -5397,6 +5397,15 @@ qla2x00_do_work(struct scsi_qla_host *vha)
|
|
|
3c6e85 |
e->u.fcport.fcport, false);
|
|
|
3c6e85 |
break;
|
|
|
3c6e85 |
}
|
|
|
3c6e85 |
+
|
|
|
3c6e85 |
+ if (rc == EAGAIN) {
|
|
|
3c6e85 |
+ /* put 'work' at head of 'vha->work_list' */
|
|
|
3c6e85 |
+ spin_lock_irqsave(&vha->work_lock, flags);
|
|
|
3c6e85 |
+ list_splice(&work, &vha->work_list);
|
|
|
3c6e85 |
+ spin_unlock_irqrestore(&vha->work_lock, flags);
|
|
|
3c6e85 |
+ break;
|
|
|
3c6e85 |
+ }
|
|
|
3c6e85 |
+ list_del_init(&e->list);
|
|
|
3c6e85 |
if (e->flags & QLA_EVT_FLAG_FREE)
|
|
|
3c6e85 |
kfree(e);
|
|
|
3c6e85 |
|
|
|
3c6e85 |
--
|
|
|
3c6e85 |
2.13.6
|
|
|
3c6e85 |
|