Grab the socket buffer send or receive mutex when performing a
read-modify-write on the sb_state field. This commit catches only the "easy" ones where it doesn't interact with as yet unmerged locking.
This commit is contained in:
parent
62d7f46e88
commit
7721f5d760
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=130513
@ -211,7 +211,9 @@ fifo_open(ap)
|
||||
}
|
||||
fip->fi_readers = fip->fi_writers = 0;
|
||||
wso->so_snd.sb_lowat = PIPE_BUF;
|
||||
SOCKBUF_LOCK(&rso->so_rcv);
|
||||
rso->so_rcv.sb_state |= SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&rso->so_rcv);
|
||||
vp->v_fifoinfo = fip;
|
||||
}
|
||||
|
||||
@ -229,7 +231,9 @@ fifo_open(ap)
|
||||
if (ap->a_mode & FREAD) {
|
||||
fip->fi_readers++;
|
||||
if (fip->fi_readers == 1) {
|
||||
SOCKBUF_LOCK(&fip->fi_writesock->so_snd);
|
||||
fip->fi_writesock->so_snd.sb_state &= ~SBS_CANTSENDMORE;
|
||||
SOCKBUF_UNLOCK(&fip->fi_writesock->so_snd);
|
||||
if (fip->fi_writers > 0) {
|
||||
wakeup(&fip->fi_writers);
|
||||
sowwakeup(fip->fi_writesock);
|
||||
@ -243,7 +247,9 @@ fifo_open(ap)
|
||||
}
|
||||
fip->fi_writers++;
|
||||
if (fip->fi_writers == 1) {
|
||||
SOCKBUF_LOCK(&fip->fi_writesock->so_rcv);
|
||||
fip->fi_readsock->so_rcv.sb_state &= ~SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&fip->fi_writesock->so_rcv);
|
||||
if (fip->fi_readers > 0) {
|
||||
wakeup(&fip->fi_readers);
|
||||
sorwakeup(fip->fi_writesock);
|
||||
|
@ -154,8 +154,12 @@ soisdisconnecting(so)
|
||||
|
||||
so->so_state &= ~SS_ISCONNECTING;
|
||||
so->so_state |= SS_ISDISCONNECTING;
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
SOCKBUF_LOCK(&so->so_snd);
|
||||
so->so_snd.sb_state |= SBS_CANTSENDMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_snd);
|
||||
wakeup(&so->so_timeo);
|
||||
sowwakeup(so);
|
||||
sorwakeup(so);
|
||||
@ -168,8 +172,12 @@ soisdisconnected(so)
|
||||
|
||||
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
|
||||
so->so_state |= SS_ISDISCONNECTED;
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
SOCKBUF_LOCK(&so->so_snd);
|
||||
so->so_snd.sb_state |= SBS_CANTSENDMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_snd);
|
||||
wakeup(&so->so_timeo);
|
||||
sbdrop(&so->so_snd, so->so_snd.sb_cc);
|
||||
sowwakeup(so);
|
||||
|
@ -154,8 +154,12 @@ soisdisconnecting(so)
|
||||
|
||||
so->so_state &= ~SS_ISCONNECTING;
|
||||
so->so_state |= SS_ISDISCONNECTING;
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
SOCKBUF_LOCK(&so->so_snd);
|
||||
so->so_snd.sb_state |= SBS_CANTSENDMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_snd);
|
||||
wakeup(&so->so_timeo);
|
||||
sowwakeup(so);
|
||||
sorwakeup(so);
|
||||
@ -168,8 +172,12 @@ soisdisconnected(so)
|
||||
|
||||
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
|
||||
so->so_state |= SS_ISDISCONNECTED;
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
SOCKBUF_LOCK(&so->so_snd);
|
||||
so->so_snd.sb_state |= SBS_CANTSENDMORE;
|
||||
SOCKBUF_UNLOCK(&so->so_snd);
|
||||
wakeup(&so->so_timeo);
|
||||
sbdrop(&so->so_snd, so->so_snd.sb_cc);
|
||||
sowwakeup(so);
|
||||
|
@ -2249,8 +2249,11 @@ tcp_input(m, off0)
|
||||
tp->rcv_up = th->th_seq + th->th_urp;
|
||||
so->so_oobmark = so->so_rcv.sb_cc +
|
||||
(tp->rcv_up - tp->rcv_nxt) - 1;
|
||||
if (so->so_oobmark == 0)
|
||||
if (so->so_oobmark == 0) {
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_RCVATMARK;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
}
|
||||
sohasoutofband(so);
|
||||
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
|
||||
}
|
||||
|
@ -2249,8 +2249,11 @@ tcp_input(m, off0)
|
||||
tp->rcv_up = th->th_seq + th->th_urp;
|
||||
so->so_oobmark = so->so_rcv.sb_cc +
|
||||
(tp->rcv_up - tp->rcv_nxt) - 1;
|
||||
if (so->so_oobmark == 0)
|
||||
if (so->so_oobmark == 0) {
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_RCVATMARK;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
}
|
||||
sohasoutofband(so);
|
||||
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
|
||||
}
|
||||
|
@ -566,8 +566,11 @@ register struct spx *si;
|
||||
cb->s_oobflags &= ~SF_IOOB;
|
||||
if (so->so_rcv.sb_cc)
|
||||
so->so_oobmark = so->so_rcv.sb_cc;
|
||||
else
|
||||
else {
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state |= SBS_RCVATMARK;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
}
|
||||
}
|
||||
q = q->si_prev;
|
||||
remque(q->si_next);
|
||||
@ -597,7 +600,9 @@ register struct spx *si;
|
||||
MCHTYPE(m, MT_OOBDATA);
|
||||
spx_newchecks[1]++;
|
||||
so->so_oobmark = 0;
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
so->so_rcv.sb_state &= ~SBS_RCVATMARK;
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
}
|
||||
if (packetp == 0) {
|
||||
m->m_data += SPINC;
|
||||
|
Loading…
Reference in New Issue
Block a user