Index: sys/dev/iscsi/icl_soft_proxy.c =================================================================== --- sys/dev/iscsi/icl_soft_proxy.c +++ sys/dev/iscsi/icl_soft_proxy.c @@ -177,6 +177,7 @@ icl_listen_free(struct icl_listen *il) { struct icl_listen_sock *ils; + sbintime_t sbt, pr; sx_xlock(&il->il_lock); while (!TAILQ_EMPTY(&il->il_sockets)) { @@ -188,7 +189,9 @@ ils->ils_socket->so_error = ENOTCONN; SOLISTEN_UNLOCK(ils->ils_socket); wakeup(&ils->ils_socket->so_timeo); - pause("icl_unlisten", 1 * hz); + sbt = SBT_1S - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + pause_sbt("icl_unlisten", sbt, pr, 0); sx_xlock(&il->il_lock); } Index: sys/dev/iscsi/iscsi.c =================================================================== --- sys/dev/iscsi/iscsi.c +++ sys/dev/iscsi/iscsi.c @@ -546,6 +546,7 @@ struct iscsi_bhs_nop_out *bhsno; struct iscsi_session *is; bool reconnect_needed = false; + sbintime_t sbt, pr; is = context; @@ -555,7 +556,9 @@ return; } - callout_schedule(&is->is_callout, 1 * hz); + sbt = ((ping_timeout * SBT_1S) / 3) - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + callout_schedule_sbt(&is->is_callout, sbt, pr, 0); if (is->is_conf.isc_enable == 0) goto out; @@ -563,7 +566,7 @@ is->is_timeout++; if (is->is_waiting_for_iscsid) { - if (iscsid_timeout > 0 && is->is_timeout > iscsid_timeout) { + if (iscsid_timeout > 0 && is->is_timeout > 0) { ISCSI_SESSION_WARN(is, "timed out waiting for iscsid(8) " "for %d seconds; reconnecting", is->is_timeout); @@ -573,7 +576,7 @@ } if (is->is_login_phase) { - if (login_timeout > 0 && is->is_timeout > login_timeout) { + if (login_timeout > 0 && is->is_timeout > 0) { ISCSI_SESSION_WARN(is, "login timed out after %d seconds; " "reconnecting", is->is_timeout); reconnect_needed = true; @@ -591,7 +594,7 @@ goto out; } - if (is->is_timeout >= ping_timeout) { + if (is->is_timeout >= 3) { ISCSI_SESSION_WARN(is, "no ping reply (NOP-In) after %d seconds; " "reconnecting", ping_timeout); reconnect_needed = true; @@ -1401,6 +1404,12 @@ is->is_waiting_for_iscsid = false; is->is_login_phase = true; + is->is_timeout = 0; + sbt = SBT_1S - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + if (login_timeout > 0) + sbt = login_timeout * SBT_1S - 5 * SBT_1MS; + callout_schedule_sbt(&is->is_callout, sbt, pr, 0); is->is_reason[0] = '\0'; ISCSI_SESSION_UNLOCK(is); @@ -1507,6 +1516,11 @@ is->is_login_phase = false; is->is_timeout = 0; is->is_connected = true; + sbt = SBT_1S - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + if (ping_timeout > 0) + sbt = ((ping_timeout * SBT_1S) / 3) - 5 * SBT_1MS; + callout_schedule(&is->is_callout, sbt, pr, 0); is->is_reason[0] = '\0'; ISCSI_SESSION_UNLOCK(is); @@ -1616,6 +1630,7 @@ struct iscsi_session *is; struct sockaddr *from_sa, *to_sa; int error; + sbintime_t sbt, pr; sx_slock(&sc->sc_lock); TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { @@ -1654,6 +1669,11 @@ is->is_waiting_for_iscsid = false; is->is_login_phase = true; is->is_timeout = 0; + sbt = SBT_1S - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + if (login_timeout > 0) + sbt = login_timeout * SBT_1S - 5 * SBT_1MS; + callout_schedule_sbt(&is->is_callout, sbt, pr, 0); ISCSI_SESSION_UNLOCK(is); error = icl_conn_connect(is->is_conn, idc->idc_domain, @@ -1835,6 +1855,7 @@ struct iscsi_session *is; const struct iscsi_session *is2; int error; + sbintime_t sbt, pr; iscsi_sanitize_session_conf(&isa->isa_conf); if (iscsi_valid_session_conf(&isa->isa_conf) == false) @@ -1912,7 +1933,12 @@ return (error); } - callout_reset(&is->is_callout, 1 * hz, iscsi_callout, is); + sbt = SBT_1S - 5 * SBT_1MS; + pr = 10 * SBT_1MS; + if (iscsid_timeout > 0) { + sbt = iscsid_timeout * SBT_1S - 5 * SBT_1MS; + } + callout_reset_sbt(&is->is_callout, sbt, pr, iscsi_callout, is, 0); TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next); ISCSI_SESSION_LOCK(is);