summaryrefslogtreecommitdiffstats
path: root/sys/netinet/sctputil.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/sctputil.c')
-rw-r--r--sys/netinet/sctputil.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c
index 0d0c270..bb1911d 100644
--- a/sys/netinet/sctputil.c
+++ b/sys/netinet/sctputil.c
@@ -3862,9 +3862,7 @@ sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp,
old_so = old_inp->sctp_socket;
new_so = new_inp->sctp_socket;
TAILQ_INIT(&tmp_queue);
- SOCKBUF_LOCK(&(old_so->so_rcv));
error = sblock(&old_so->so_rcv, waitflags);
- SOCKBUF_UNLOCK(&(old_so->so_rcv));
if (error) {
/*
* Gak, can't get sblock, we have a problem. data will be
@@ -3903,10 +3901,8 @@ sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp,
}
SCTP_INP_READ_UNLOCK(old_inp);
/* Remove the sb-lock on the old socket */
- SOCKBUF_LOCK(&(old_so->so_rcv));
sbunlock(&old_so->so_rcv);
- SOCKBUF_UNLOCK(&(old_so->so_rcv));
/* Now we move them over to the new socket buffer */
control = TAILQ_FIRST(&tmp_queue);
SCTP_INP_READ_LOCK(new_inp);
@@ -4521,6 +4517,7 @@ sctp_sorecvmsg(struct socket *so,
int alen = 0;
int slen = 0;
int held_length = 0;
+ int sockbuf_lock = 0;
if (msg_flags) {
in_flags = *msg_flags;
@@ -4558,8 +4555,6 @@ sctp_sorecvmsg(struct socket *so,
sctp_misc_ints(SCTP_SORECV_ENTER,
rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, uio->uio_resid);
#endif
- SOCKBUF_LOCK(&so->so_rcv);
- hold_sblock = 1;
#ifdef SCTP_RECV_RWND_LOGGING
sctp_misc_ints(SCTP_SORECV_ENTERPL,
rwnd_req, block_allowed, so->so_rcv.sb_cc, uio->uio_resid);
@@ -4567,15 +4562,12 @@ sctp_sorecvmsg(struct socket *so,
error = sblock(&so->so_rcv, (block_allowed ? M_WAITOK : 0));
+ sockbuf_lock = 1;
if (error) {
goto release_unlocked;
}
restart:
- if (hold_sblock == 0) {
- SOCKBUF_LOCK(&so->so_rcv);
- hold_sblock = 1;
- }
- sbunlock(&so->so_rcv);
+
restart_nosblocks:
if (hold_sblock == 0) {
@@ -4704,7 +4696,6 @@ restart_nosblocks:
SOCKBUF_UNLOCK(&so->so_rcv);
hold_sblock = 0;
}
- error = sblock(&so->so_rcv, (block_allowed ? M_WAITOK : 0));
/* we possibly have data we can read */
control = TAILQ_FIRST(&inp->read_queue);
if (control == NULL) {
@@ -5529,11 +5520,12 @@ release:
SCTP_INP_READ_UNLOCK(inp);
hold_rlock = 0;
}
- if (hold_sblock == 0) {
- SOCKBUF_LOCK(&so->so_rcv);
- hold_sblock = 1;
+ if (hold_sblock == 1) {
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ hold_sblock = 0;
}
sbunlock(&so->so_rcv);
+ sockbuf_lock = 0;
release_unlocked:
if (hold_sblock) {
@@ -5566,6 +5558,9 @@ out:
SOCKBUF_UNLOCK(&so->so_rcv);
hold_sblock = 0;
}
+ if (sockbuf_lock) {
+ sbunlock(&so->so_rcv);
+ }
if (freecnt_applied) {
/*
* The lock on the socket buffer protects us so the free
OpenPOWER on IntegriCloud