summaryrefslogtreecommitdiffstats
path: root/sys/netipx/spx_usrreq.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-01-02 15:36:16 +0000
committerrwatson <rwatson@FreeBSD.org>2005-01-02 15:36:16 +0000
commit07800ca5f17122964aa91b60bd676029e99eba3e (patch)
treeb37495bd5af8dadf6f63edcbe78b586ba7a09bb6 /sys/netipx/spx_usrreq.c
parent56df19b4b34a98524cfdc7cd4f7842505c793be4 (diff)
downloadFreeBSD-src-07800ca5f17122964aa91b60bd676029e99eba3e.zip
FreeBSD-src-07800ca5f17122964aa91b60bd676029e99eba3e.tar.gz
Increase the coverage scope of the receive socket buffer lock in
spx_reass() to increase atomicity across multiple operations on the socket buffer when iterating over the SPX fragment reassembly list for the ipxpcb, as well a to reduce the number of locking operations.
Diffstat (limited to 'sys/netipx/spx_usrreq.c')
-rw-r--r--sys/netipx/spx_usrreq.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/netipx/spx_usrreq.c b/sys/netipx/spx_usrreq.c
index 099d42b..b16c2a7 100644
--- a/sys/netipx/spx_usrreq.c
+++ b/sys/netipx/spx_usrreq.c
@@ -591,6 +591,7 @@ update_window:
}
present:
#define SPINC sizeof(struct spxhdr)
+ SOCKBUF_LOCK(&so->so_rcv);
/*
* Loop through all packets queued up to update acknowledge
* number, and present all acknowledged data to user;
@@ -602,12 +603,10 @@ present:
m = dtom(q);
if (SI(q)->si_cc & SPX_OB) {
cb->s_oobflags &= ~SF_IOOB;
- SOCKBUF_LOCK(&so->so_rcv);
if (so->so_rcv.sb_cc)
so->so_oobmark = so->so_rcv.sb_cc;
else
so->so_rcv.sb_state |= SBS_RCVATMARK;
- SOCKBUF_UNLOCK(&so->so_rcv);
}
q = q->si_prev;
remque(q->si_next);
@@ -630,16 +629,14 @@ present:
s[0] = 5;
s[1] = 1;
*(u_char *)(&s[2]) = dt;
- sbappend(&so->so_rcv, mm);
+ sbappend_locked(&so->so_rcv, mm);
}
}
if (sp->spx_cc & SPX_OB) {
MCHTYPE(m, MT_OOBDATA);
spx_newchecks[1]++;
- SOCKBUF_LOCK(&so->so_rcv);
so->so_oobmark = 0;
so->so_rcv.sb_state &= ~SBS_RCVATMARK;
- SOCKBUF_UNLOCK(&so->so_rcv);
}
if (packetp == 0) {
m->m_data += SPINC;
@@ -647,26 +644,28 @@ present:
m->m_pkthdr.len -= SPINC;
}
if ((sp->spx_cc & SPX_EM) || packetp) {
- sbappendrecord(&so->so_rcv, m);
+ sbappendrecord_locked(&so->so_rcv, m);
spx_newchecks[9]++;
} else
- sbappend(&so->so_rcv, m);
+ sbappend_locked(&so->so_rcv, m);
} else
#endif
if (packetp) {
- sbappendrecord(&so->so_rcv, m);
+ sbappendrecord_locked(&so->so_rcv, m);
} else {
cb->s_rhdr = *mtod(m, struct spxhdr *);
m->m_data += SPINC;
m->m_len -= SPINC;
m->m_pkthdr.len -= SPINC;
- sbappend(&so->so_rcv, m);
+ sbappend_locked(&so->so_rcv, m);
}
} else
break;
}
if (wakeup)
- sorwakeup(so);
+ sorwakeup_locked(so);
+ else
+ SOCKBUF_UNLOCK(&so->so_rcv);
return (0);
}
OpenPOWER on IntegriCloud