mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 18:19:28 +09:00
scsi: qla2xxx: edif: Fix app start delay
[ Upstream commitb492d6a488] Current driver does unnecessary pause for each session to get to certain state before allowing the app start call to return. In larger environment, this introduces a long delay. Originally the delay was meant to synchronize app and driver. However, the with current implementation the two sides use various events to synchronize their state. The same is applied to the authentication failure call. Link: https://lore.kernel.org/r/20211026115412.27691-6-njavali@marvell.com Fixes:4de067e5df("scsi: qla2xxx: edif: Add N2N support for EDIF") 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
696815ee50
commit
dcd0c5e7de
@@ -290,63 +290,6 @@ qla_edif_app_check(scsi_qla_host_t *vha, struct app_id appid)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void qla_edif_reset_auth_wait(struct fc_port *fcport, int state,
|
||||
int waitonly)
|
||||
{
|
||||
int cnt, max_cnt = 200;
|
||||
bool traced = false;
|
||||
|
||||
fcport->keep_nport_handle = 1;
|
||||
|
||||
if (!waitonly) {
|
||||
qla2x00_set_fcport_disc_state(fcport, state);
|
||||
qlt_schedule_sess_for_deletion(fcport);
|
||||
} else {
|
||||
qla2x00_set_fcport_disc_state(fcport, state);
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
|
||||
"%s: waiting for session, max_cnt=%u\n",
|
||||
__func__, max_cnt);
|
||||
|
||||
cnt = 0;
|
||||
|
||||
if (waitonly) {
|
||||
/* Marker wait min 10 msecs. */
|
||||
msleep(50);
|
||||
cnt += 50;
|
||||
}
|
||||
while (1) {
|
||||
if (!traced) {
|
||||
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
|
||||
"%s: session sleep.\n",
|
||||
__func__);
|
||||
traced = true;
|
||||
}
|
||||
msleep(20);
|
||||
cnt++;
|
||||
if (waitonly && (fcport->disc_state == state ||
|
||||
fcport->disc_state == DSC_LOGIN_COMPLETE))
|
||||
break;
|
||||
if (fcport->disc_state == DSC_LOGIN_AUTH_PEND)
|
||||
break;
|
||||
if (cnt > max_cnt)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!waitonly) {
|
||||
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
|
||||
"%s: waited for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
|
||||
__func__, fcport->port_name, fcport->loop_id,
|
||||
fcport->d_id.b24, fcport, fcport->disc_state, cnt);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
|
||||
"%s: waited ONLY for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
|
||||
__func__, fcport->port_name, fcport->loop_id,
|
||||
fcport->d_id.b24, fcport, fcport->disc_state, cnt);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl,
|
||||
int index)
|
||||
@@ -583,8 +526,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
||||
ql_dbg(ql_dbg_edif, vha, 0x911e,
|
||||
"%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
|
||||
__func__, fcport->port_name);
|
||||
fcport->edif.app_sess_online = 1;
|
||||
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
|
||||
fcport->edif.app_sess_online = 0;
|
||||
qlt_schedule_sess_for_deletion(fcport);
|
||||
qla_edif_sa_ctl_init(vha, fcport);
|
||||
}
|
||||
}
|
||||
@@ -800,7 +743,6 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
||||
ql_dbg(ql_dbg_edif, vha, 0x911e,
|
||||
"%s AUTH complete - RESUME with prli for wwpn %8phC\n",
|
||||
__func__, fcport->port_name);
|
||||
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 1);
|
||||
qla24xx_post_prli_work(vha, fcport);
|
||||
}
|
||||
|
||||
@@ -873,7 +815,7 @@ qla_edif_app_authfail(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
||||
|
||||
if (qla_ini_mode_enabled(fcport->vha)) {
|
||||
fcport->send_els_logo = 1;
|
||||
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
|
||||
qlt_schedule_sess_for_deletion(fcport);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user