Fix tight loop spinning on postponed requests.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2017-02-17 04:29:23 +00:00
parent 7174af791e
commit 5b338bc073

View File

@ -475,15 +475,14 @@ iscsi_maintenance_thread_terminate(struct iscsi_session *is)
static void static void
iscsi_maintenance_thread(void *arg) iscsi_maintenance_thread(void *arg)
{ {
struct iscsi_session *is; struct iscsi_session *is = arg;
is = arg;
ISCSI_SESSION_LOCK(is);
for (;;) { for (;;) {
ISCSI_SESSION_LOCK(is);
if (is->is_reconnecting == false && if (is->is_reconnecting == false &&
is->is_terminating == false && is->is_terminating == false &&
STAILQ_EMPTY(&is->is_postponed)) (STAILQ_EMPTY(&is->is_postponed) ||
ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn)))
cv_wait(&is->is_maintenance_cv, &is->is_lock); cv_wait(&is->is_maintenance_cv, &is->is_lock);
/* Terminate supersedes reconnect. */ /* Terminate supersedes reconnect. */
@ -497,12 +496,13 @@ iscsi_maintenance_thread(void *arg)
if (is->is_reconnecting) { if (is->is_reconnecting) {
ISCSI_SESSION_UNLOCK(is); ISCSI_SESSION_UNLOCK(is);
iscsi_maintenance_thread_reconnect(is); iscsi_maintenance_thread_reconnect(is);
ISCSI_SESSION_LOCK(is);
continue; continue;
} }
iscsi_session_send_postponed(is); iscsi_session_send_postponed(is);
ISCSI_SESSION_UNLOCK(is);
} }
ISCSI_SESSION_UNLOCK(is);
} }
static void static void