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 rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.83.2.4 retrieving revision 1.83.2.9 diff -u -p -r1.83.2.4 -r1.83.2.9 --- src/sys/kern/uipc_socket.c 2004/09/03 12:45:39 1.83.2.4 +++ src/sys/kern/uipc_socket.c 2005/04/01 14:30:57 1.83.2.9 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.83.2.4 2004/09/03 12:45:39 skrll Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.83.2.9 2005/04/01 14:30:57 skrll Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.83.2.4 2004/09/03 12:45:39 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.83.2.9 2005/04/01 14:30:57 skrll Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -234,7 +234,7 @@ sokvaalloc(vsize_t len, struct socket *s * allocate kva. */ - lva = uvm_km_valloc_wait(kernel_map, len); + lva = uvm_km_alloc(kernel_map, len, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); if (lva == 0) { sokvaunreserve(len); return (0); @@ -255,7 +255,7 @@ sokvafree(vaddr_t sva, vsize_t len) * free kva. */ - uvm_km_free(kernel_map, sva, len); + uvm_km_free(kernel_map, sva, len, UVM_KMF_VAONLY); /* * unreserve kva. @@ -877,7 +877,7 @@ sosend(struct socket *so, struct mbuf *a break; } } while (space > 0 && atomic); - + s = splsoftnet(); if (so->so_state & SS_CANTSENDMORE) @@ -936,7 +936,6 @@ soreceive(struct socket *so, struct mbuf struct mbuf **mp0, struct mbuf **controlp, int *flagsp) { struct lwp *l; - struct proc *p; struct mbuf *m, **mp; int flags, len, error, s, offset, moff, type, orig_resid; const struct protosw *pr; @@ -948,7 +947,6 @@ soreceive(struct socket *so, struct mbuf type = 0; orig_resid = uio->uio_resid; l = uio->uio_lwp; - p = l->l_proc; if (paddr) *paddr = 0; @@ -1056,8 +1054,8 @@ soreceive(struct socket *so, struct mbuf * While we process the initial mbufs containing address and control * info, we save a copy of m->m_nextpkt into nextrecord. */ - if (p) - p->p_stats->p_ru.ru_msgrcv++; + if (l) + l->l_proc->p_stats->p_ru.ru_msgrcv++; KASSERT(m == so->so_rcv.sb_mb); SBLASTRECORDCHK(&so->so_rcv, "soreceive 1"); SBLASTMBUFCHK(&so->so_rcv, "soreceive 1"); @@ -1096,7 +1094,7 @@ soreceive(struct socket *so, struct mbuf mbuf_removed = 1; if (controlp) { struct domain *dom = pr->pr_domain; - if (dom->dom_externalize && p && + if (dom->dom_externalize && l && mtod(m, struct cmsghdr *)->cmsg_type == SCM_RIGHTS) error = (*dom->dom_externalize)(m, l); @@ -1337,7 +1335,7 @@ soreceive(struct socket *so, struct mbuf splx(s); goto restart; } - + if (flagsp) *flagsp |= flags; release: @@ -1606,6 +1604,10 @@ sogetopt(struct socket *so, int level, i break; } + case SO_OVERFLOWED: + *mtod(m, int *) = so->so_rcv.sb_overflowed; + break; + default: (void)m_free(m); return (ENOPROTOOPT); @@ -1642,7 +1644,7 @@ filt_soread(struct knote *kn, long hint) so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = so->so_rcv.sb_cc; if (so->so_state & SS_CANTRCVMORE) { - kn->kn_flags |= EV_EOF; + kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } @@ -1673,7 +1675,7 @@ filt_sowrite(struct knote *kn, long hint so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = sbspace(&so->so_snd); if (so->so_state & SS_CANTSENDMORE) { - kn->kn_flags |= EV_EOF; + kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } @@ -1698,7 +1700,7 @@ filt_solisten(struct knote *kn, long hin /* * Set kn_data to number of incoming connections, not * counting partial (incomplete) connections. - */ + */ kn->kn_data = so->so_qlen; return (kn->kn_data > 0); }