Don't spin with mutex hold when there is not enough room in the send socket

buffer.  While here, make the code flow somewhat nicer.

Thanks to mav@ for tracking it down.

Tested by:	mav
MFC after:	3 days
Sponsored by:	FreeBSD Foundation
This commit is contained in:
trasz 2013-10-24 15:54:06 +00:00
parent 7a74ddb4bc
commit 1602cbfff0

View File

@ -723,11 +723,7 @@ icl_receive_thread(void *arg)
for (;;) {
if (ic->ic_disconnecting) {
//ICL_DEBUG("terminating");
ICL_CONN_LOCK(ic);
ic->ic_receive_running = false;
ICL_CONN_UNLOCK(ic);
kthread_exit();
return;
break;
}
SOCKBUF_LOCK(&so->so_rcv);
@ -740,6 +736,11 @@ icl_receive_thread(void *arg)
icl_conn_receive_pdus(ic, available);
}
ICL_CONN_LOCK(ic);
ic->ic_receive_running = false;
ICL_CONN_UNLOCK(ic);
kthread_exit();
}
static int
@ -879,22 +880,19 @@ icl_send_thread(void *arg)
ICL_CONN_LOCK(ic);
ic->ic_send_running = true;
ICL_CONN_UNLOCK(ic);
for (;;) {
ICL_CONN_LOCK(ic);
if (ic->ic_disconnecting) {
//ICL_DEBUG("terminating");
ic->ic_send_running = false;
ICL_CONN_UNLOCK(ic);
kthread_exit();
return;
break;
}
if (TAILQ_EMPTY(&ic->ic_to_send))
cv_wait(&ic->ic_send_cv, &ic->ic_lock);
icl_conn_send_pdus(ic);
ICL_CONN_UNLOCK(ic);
cv_wait(&ic->ic_send_cv, &ic->ic_lock);
}
ic->ic_send_running = false;
ICL_CONN_UNLOCK(ic);
kthread_exit();
}
static int