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.96 retrieving revision 1.99 diff -u -p -r1.96 -r1.99 --- src/sys/kern/uipc_socket.c 2004/03/21 00:54:46 1.96 +++ src/sys/kern/uipc_socket.c 2004/04/22 01:01:40 1.99 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.96 2004/03/21 00:54:46 mycroft Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.99 2004/04/22 01:01:40 matt Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.96 2004/03/21 00:54:46 mycroft Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.99 2004/04/22 01:01:40 matt Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -162,13 +162,14 @@ int sokvawaiters; static size_t sodopendfree(struct socket *); static size_t sodopendfreel(struct socket *); -static __inline void sokvareserve(struct socket *, vsize_t); +static __inline vsize_t sokvareserve(struct socket *, vsize_t); static __inline void sokvaunreserve(vsize_t); -static __inline void +static __inline vsize_t sokvareserve(struct socket *so, vsize_t len) { int s; + int error; s = splvm(); simple_lock(&so_pendfree_slock); @@ -190,12 +191,18 @@ sokvareserve(struct socket *so, vsize_t SOSEND_COUNTER_INCR(&sosend_kvalimit); sokvawaiters++; - (void) ltsleep(&socurkva, PVM, "sokva", 0, &so_pendfree_slock); + error = ltsleep(&socurkva, PVM | PCATCH, "sokva", 0, + &so_pendfree_slock); sokvawaiters--; + if (error) { + len = 0; + break; + } } socurkva += len; simple_unlock(&so_pendfree_slock); splx(s); + return len; } static __inline void @@ -225,7 +232,8 @@ sokvaalloc(vsize_t len, struct socket *s * reserve kva. */ - sokvareserve(so, len); + if (sokvareserve(so, len) == 0) + return 0; /* * allocate kva. @@ -450,7 +458,7 @@ int socreate(int dom, struct socket **aso, int type, int proto) { struct proc *p; - struct protosw *prp; + const struct protosw *prp; struct socket *so; int error, s; @@ -479,6 +487,8 @@ socreate(int dom, struct socket **aso, i #endif if (p != 0) so->so_uid = p->p_ucred->cr_uid; + else + so->so_uid = UID_MAX; error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, (struct mbuf *)(long)proto, (struct mbuf *)0, p); if (error) { @@ -540,7 +550,13 @@ sofree(struct socket *so) if (!soqremque(so, 0)) return; } - sbrelease(&so->so_snd); + if (so->so_rcv.sb_hiwat) + (void)chgsbsize(so->so_uid, &so->so_rcv.sb_hiwat, 0, + RLIM_INFINITY); + if (so->so_snd.sb_hiwat) + (void)chgsbsize(so->so_uid, &so->so_snd.sb_hiwat, 0, + RLIM_INFINITY); + sbrelease(&so->so_snd, so); sorflush(so); pool_put(&socket_pool, so); } @@ -926,7 +942,7 @@ soreceive(struct socket *so, struct mbuf { struct mbuf *m, **mp; int flags, len, error, s, offset, moff, type, orig_resid; - struct protosw *pr; + const struct protosw *pr; struct mbuf *nextrecord; int mbuf_removed = 0; @@ -1329,7 +1345,7 @@ soreceive(struct socket *so, struct mbuf int soshutdown(struct socket *so, int how) { - struct protosw *pr; + const struct protosw *pr; pr = so->so_proto; if (!(how == SHUT_RD || how == SHUT_WR || how == SHUT_RDWR)) @@ -1347,7 +1363,7 @@ void sorflush(struct socket *so) { struct sockbuf *sb, asb; - struct protosw *pr; + const struct protosw *pr; int s; sb = &so->so_rcv; @@ -1367,7 +1383,7 @@ sorflush(struct socket *so) splx(s); if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) (*pr->pr_domain->dom_dispose)(asb.sb_mb); - sbrelease(&asb); + sbrelease(&asb, so); } int @@ -1441,7 +1457,7 @@ sosetopt(struct socket *so, int level, i case SO_RCVBUF: if (sbreserve(optname == SO_SNDBUF ? &so->so_snd : &so->so_rcv, - (u_long) optval) == 0) { + (u_long) optval, so) == 0) { error = ENOBUFS; goto bad; } @@ -1756,7 +1772,14 @@ sysctl_kern_somaxkva(SYSCTLFN_ARGS) SYSCTL_SETUP(sysctl_kern_somaxkva_setup, "sysctl kern.somaxkva setup") { - sysctl_createv(SYSCTL_PERMANENT|SYSCTL_READWRITE, + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "kern", NULL, + NULL, 0, NULL, 0, + CTL_KERN, CTL_EOL); + + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, "somaxkva", NULL, sysctl_kern_somaxkva, 0, NULL, 0, CTL_KERN, KERN_SOMAXKVA, CTL_EOL);