From 07800ca5f17122964aa91b60bd676029e99eba3e Mon Sep 17 00:00:00 2001 From: rwatson Date: Sun, 2 Jan 2005 15:36:16 +0000 Subject: 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. --- sys/netipx/spx_usrreq.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'sys/netipx/spx_usrreq.c') 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); } -- cgit v1.1