Patch "scsi: qla2xxx: Fix Relogin being triggered too fast" has been added to the 4.15-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
scsi: qla2xxx: Fix Relogin being triggered too fast
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-qla2xxx-fix-relogin-being-triggered-too-fast.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4005a995668b8fd58f4cf1460dd4cf63efa18363Mon Sep 17 00:00:00 2001
From: Quinn Tran <[email protected]>
Date: Mon, 4 Dec 2017 14:45:06 -0800
Subject: scsi: qla2xxx: Fix Relogin being triggered too fast
From: Quinn Tran <[email protected]>
commit 4005a995668b8fd58f4cf1460dd4cf63efa18363 upstream.
Current driver design schedules relogin process via DPC thread every 1 second. In a large fabric, this DPC thread tries to schedule too many jobs and might get overloaded. As a result of this processing of DPC thread, it can schedule relogin earlier than 1 second.
--- drivers/scsi/qla2xxx/qla_def.h | 1 + drivers/scsi/qla2xxx/qla_mid.c | 22 ++++++++++++++-------- drivers/scsi/qla2xxx/qla_os.c | 22 ++++++++++++++-------- 3 files changed, 29 insertions(+), 16 deletions(-)
drivers/scsi/qla2xxx/qla_def.h +1 -0
@@ -4110,6 +4110,7 @@ typedef struct scsi_qla_host {#define LOOP_READY 5#define LOOP_DEAD 6 +unsigned long relogin_jif;unsigned long dpc_flags;#define RESET_MARKER_NEEDED 0/* Send marker to ISP. */ #define RESET_ACTIVE 1
drivers/scsi/qla2xxx/qla_mid.c +14 -8
@@ -343,15 +343,21 @@ qla2x00_do_dpc_vp(scsi_qla_host_t *vha) "FCPort update end.\n"); } -if ((test_and_clear_bit (RELOGIN_NEEDED , &vha->dpc_flags)) && - !test_bit (LOOP_RESYNC_NEEDED , &vha->dpc_flags) && -atomic_read (&vha->loop_state) !=LOOP_DOWN ) { +if (test_bit (RELOGIN_NEEDED , &vha->dpc_flags) && + !test_bit (LOOP_RESYNC_NEEDED , &vha->dpc_flags) && +atomic_read (&vha->loop_state) !=LOOP_DOWN ) { -ql_dbg (ql_dbg_dpc, vha,0x4018 , -"Relogin needed scheduled.\n" ); -qla2x00_relogin (vha); -ql_dbg (ql_dbg_dpc, vha,0x4019 , -"Relogin needed end.\n" ); +if (!vha->relogin_jif || +time_after_eq (jiffies, vha->relogin_jif)) { + vha->relogin_jif = jiffies +HZ ; +clear_bit (RELOGIN_NEEDED , &vha->dpc_flags); + +ql_dbg (ql_dbg_dpc, vha,0x4018 , +"Relogin needed scheduled.\n" ); +qla2x00_relogin (vha); +ql_dbg (ql_dbg_dpc, vha,0x4019 , +"Relogin needed end.\n" ); + } } if (test_and_clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags) &&
drivers/scsi/qla2xxx/qla_os.c +14 -8
@@ -4905,7 +4905,7 @@ void qla2x00_relogin(struct scsi_qla_hos*/ if (atomic_read (&fcport->state) !=FCS_ONLINE && fcport->login_retry && !(fcport->flags &FCF_ASYNC_SENT )) { - fcport->login_retry--; +if (fcport->flags &FCF_FABRIC_DEVICE ) { ql_dbg(ql_dbg_disc, fcport->vha, 0x2108, "%s %8phC DS %d LS %d\n", __func__,
@@ -4916,6 +4916,7 @@ void qla2x00_relogin(struct scsi_qla_hos ea.fcport = fcport;qla2x00_fcport_event_handler (vha, &ea); }else { + fcport->login_retry--; status =qla2x00_local_device_login (vha, fcport);if (status ==QLA_SUCCESS ) {
@@ -5898,16 +5899,21 @@ qla2x00_do_dpc(void *data) }/* Retry each device up to login retry count */ -if ((test_and_clear_bit (RELOGIN_NEEDED , - &base_vha->dpc_flags)) && +if (test_bit (RELOGIN_NEEDED , &base_vha->dpc_flags) && !test_bit (LOOP_RESYNC_NEEDED , &base_vha->dpc_flags) &&atomic_read (&base_vha->loop_state) !=LOOP_DOWN ) { -ql_dbg (ql_dbg_dpc, base_vha,0x400d , -"Relogin scheduled.\n" ); -qla2x00_relogin (base_vha); -ql_dbg (ql_dbg_dpc, base_vha,0x400e , -"Relogin end.\n" ); +if (!base_vha->relogin_jif || +time_after_eq (jiffies, base_vha->relogin_jif)) { + base_vha->relogin_jif = jiffies +HZ ; +clear_bit (RELOGIN_NEEDED , &base_vha->dpc_flags); + +ql_dbg (ql_dbg_dpc, base_vha,0x400d , +"Relogin scheduled.\n" ); +qla2x00_relogin (base_vha); +ql_dbg (ql_dbg_dpc, base_vha,0x400e , +"Relogin end.\n" ); + } } loop_resync_check: if (test_and_clear_bit(LOOP_RESYNC_NEEDED,
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/scsi-qla2xxx-retry-switch-command-on-time-out.patch queue-4.15/scsi-qla2xxx-relogin-to-target-port-on-a-cable-swap.patch queue-4.15/scsi-qla2xxx-fix-abort-command-deadlock-due-to-spinlock.patch queue-4.15/scsi-qla2xxx-fix-re-login-for-nport-handle-in-use.patch queue-4.15/scsi-qla2xxx-fix-login-state-machine-stuck-at-gpdb.patch queue-4.15/scsi-qla2xxx-fix-system-crash-for-notify-ack-timeout-handling.patch queue-4.15/scsi-qla2xxx-replace-fcport-alloc-with-qla2x00_alloc_fcport.patch queue-4.15/scsi-qla2xxx-clear-loop-id-after-delete.patch queue-4.15/scsi-qla2xxx-fix-relogin-being-triggered-too-fast.patch queue-4.15/scsi-qla2xxx-skip-irq-affinity-for-target-qpairs.patch queue-4.15/scsi-qla2xxx-fix-scan-state-field-for-fcport.patch queue-4.15/scsi-qla2xxx-fix-prli-state-check.patch queue-4.15/scsi-qla2xxx-fix-system-crash-in-qlt_plogi_ack_unref.patch queue-4.15/scsi-qla2xxx-serialize-gpnid-for-multiple-rscn.patch queue-4.15/scsi-qla2xxx-fix-gpnid-error-processing.patch queue-4.15/scsi-qla2xxx-move-session-delete-to-driver-work-queue.patch