Index: sys/socketvar.h =================================================================== RCS file: /home/ncvs/src/sys/sys/socketvar.h,v retrieving revision 1.154 diff -u -r1.154 socketvar.h --- sys/socketvar.h 1 Aug 2006 10:30:26 -0000 1.154 +++ sys/socketvar.h 28 Jan 2007 19:40:37 -0000 @@ -516,6 +516,7 @@ void soisconnecting(struct socket *so); void soisdisconnected(struct socket *so); void soisdisconnecting(struct socket *so); +void sokrisgetsapanic(struct sockbuf *sb); int solisten(struct socket *so, int backlog, struct thread *td); void solisten_proto(struct socket *so, int backlog); int solisten_proto_check(struct socket *so); Index: kern/uipc_sockbuf.c =================================================================== RCS file: /home/ncvs/src/sys/kern/uipc_sockbuf.c,v retrieving revision 1.165 diff -u -r1.165 uipc_sockbuf.c --- kern/uipc_sockbuf.c 6 Sep 2006 21:59:36 -0000 1.165 +++ kern/uipc_sockbuf.c 28 Jan 2007 19:43:11 -0000 @@ -68,6 +68,17 @@ static void sbflush_internal(struct sockbuf *sb); static void sbrelease_internal(struct sockbuf *sb, struct socket *so); +void +sokrisgetsapanic(struct sockbuf *sb) +{ + u_int len; + + len = m_length(sb->sb_mb, NULL); + if (sb->sb_cc != len) + panic("sokrisgetsapanic(sb_cc %d, sb_mb %d)", sb->sb_cc, + len); +} + /* * Socantsendmore indicates that no more data will be sent on the socket; it * would normally be applied to a socket when the user informs the system @@ -173,6 +184,8 @@ SOCKBUF_LOCK_ASSERT(sb); + sokrisgetsapanic(sb); + selwakeuppri(&sb->sb_sel, PSOCK); sb->sb_flags &= ~SB_SEL; if (sb->sb_flags & SB_WAIT) { @@ -180,6 +193,9 @@ wakeup(&sb->sb_cc); } KNOTE_LOCKED(&sb->sb_sel.si_note, 0); + + sokrisgetsapanic(sb); + SOCKBUF_UNLOCK(sb); if ((so->so_state & SS_ASYNC) && so->so_sigio != NULL) pgsigio(&so->so_sigio, SIGIO, 0); @@ -187,6 +203,7 @@ (*so->so_upcall)(so, so->so_upcallarg, M_DONTWAIT); if (sb->sb_flags & SB_AIO) aio_swake(so, sb); + mtx_assert(SOCKBUF_MTX(sb), MA_NOTOWNED); } @@ -622,6 +639,8 @@ SOCKBUF_LOCK_ASSERT(sb); + sokrisgetsapanic(sb); + if (m0 && (m0->m_flags & M_PKTHDR) == 0) panic("sbappendaddr_locked"); if (m0) @@ -654,6 +673,9 @@ SBLASTMBUFCHK(sb); SBLASTRECORDCHK(sb); + + sokrisgetsapanic(sb); + return (1); } Index: kern/uipc_socket.c =================================================================== RCS file: /home/ncvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.289 diff -u -r1.289 uipc_socket.c --- kern/uipc_socket.c 22 Jan 2007 14:50:28 -0000 1.289 +++ kern/uipc_socket.c 28 Jan 2007 19:43:42 -0000 @@ -1470,6 +1470,7 @@ (*pr->pr_usrreqs->pru_rcvd)(so, 0); SOCKBUF_LOCK(&so->so_rcv); + sokrisgetsapanic(&so->so_rcv); restart: SOCKBUF_LOCK_ASSERT(&so->so_rcv); error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); @@ -1885,6 +1886,7 @@ SOCKBUF_LOCK_ASSERT(&so->so_rcv); sbunlock(&so->so_rcv); out: + sokrisgetsapanic(&so->so_rcv); SOCKBUF_LOCK_ASSERT(&so->so_rcv); SOCKBUF_UNLOCK(&so->so_rcv); return (error);