Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v retrieving revision 1.111.2.9 retrieving revision 1.111.2.10 diff -u -p -r1.111.2.9 -r1.111.2.10 --- src/sys/kern/uipc_socket.c 2007/11/15 11:44:56 1.111.2.9 +++ src/sys/kern/uipc_socket.c 2007/12/07 17:33:17 1.111.2.10 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.111.2.9 2007/11/15 11:44:56 yamt Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.111.2.10 2007/12/07 17:33:17 yamt Exp $ */ /*- * Copyright (c) 2002, 2007 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.111.2.9 2007/11/15 11:44:56 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.111.2.10 2007/12/07 17:33:17 yamt Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -426,11 +426,11 @@ sokva_reclaim_callback(struct callback_e } struct mbuf * -getsombuf(struct socket *so) +getsombuf(struct socket *so, int type) { struct mbuf *m; - m = m_get(M_WAIT, MT_SONAME); + m = m_get(M_WAIT, type); MCLAIM(m, so->so_mowner); return m; } @@ -440,7 +440,7 @@ m_intopt(struct socket *so, int val) { struct mbuf *m; - m = getsombuf(so); + m = getsombuf(so, MT_SOOPTS); m->m_len = sizeof(int); *mtod(m, int *) = val; return m; @@ -450,7 +450,7 @@ void soinit(void) { - mutex_init(&so_pendfree_lock, MUTEX_DRIVER, IPL_VM); + mutex_init(&so_pendfree_lock, MUTEX_DEFAULT, IPL_VM); cv_init(&socurkva_cv, "sokva"); /* Set the initial adjusted socket buffer size. */ @@ -1008,12 +1008,15 @@ soreceive(struct socket *so, struct mbuf { struct lwp *l = curlwp; struct mbuf *m, **mp; - int flags, len, error, s, offset, moff, type, orig_resid; + int atomic, flags, len, error, s, offset, moff, type, orig_resid; const struct protosw *pr; struct mbuf *nextrecord; int mbuf_removed = 0; + const struct domain *dom; pr = so->so_proto; + atomic = pr->pr_flags & PR_ATOMIC; + dom = pr->pr_domain; mp = mp0; type = 0; orig_resid = uio->uio_resid; @@ -1074,8 +1077,7 @@ soreceive(struct socket *so, struct mbuf (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && - m->m_nextpkt == NULL && - (pr->pr_flags & PR_ATOMIC) == 0)) { + m->m_nextpkt == NULL && !atomic)) { #ifdef DIAGNOSTIC if (m == NULL && so->so_rcv.sb_cc) panic("receive 1"); @@ -1164,7 +1166,6 @@ soreceive(struct socket *so, struct mbuf sbfree(&so->so_rcv, m); mbuf_removed = 1; if (controlp != NULL) { - struct domain *dom = pr->pr_domain; if (dom->dom_externalize && l && mtod(m, struct cmsghdr *)->cmsg_type == SCM_RIGHTS) @@ -1178,9 +1179,9 @@ soreceive(struct socket *so, struct mbuf * Dispose of any SCM_RIGHTS message that went * through the read path rather than recv. */ - if (pr->pr_domain->dom_dispose && + if (dom->dom_dispose && mtod(m, struct cmsghdr *)->cmsg_type == SCM_RIGHTS) - (*pr->pr_domain->dom_dispose)(m); + (*dom->dom_dispose)(m); MFREE(m, so->so_rcv.sb_mb); m = so->so_rcv.sb_mb; } @@ -1267,8 +1268,7 @@ soreceive(struct socket *so, struct mbuf * This avoids a later panic("receive 1a") * when compiled with DIAGNOSTIC. */ - if (m && mbuf_removed - && (pr->pr_flags & PR_ATOMIC)) + if (m && mbuf_removed && atomic) (void) sbdroprecord(&so->so_rcv); goto release; @@ -1371,7 +1371,7 @@ soreceive(struct socket *so, struct mbuf } } - if (m && pr->pr_flags & PR_ATOMIC) { + if (m && atomic) { flags |= MSG_TRUNC; if ((flags & MSG_PEEK) == 0) (void) sbdroprecord(&so->so_rcv); @@ -1793,7 +1793,7 @@ soo_kqfilter(struct file *fp, struct kno sb = &so->so_snd; break; default: - return (1); + return (EINVAL); } SLIST_INSERT_HEAD(&sb->sb_sel.sel_klist, kn, kn_selnext); sb->sb_flags |= SB_KNOTE;