| version 1.97.2.2, 2005/10/31 13:37:33 |
version 1.98, 2004/04/17 15:15:29 |
| Line 162 int sokvawaiters; |
|
| Line 162 int sokvawaiters; |
|
| |
|
| static size_t sodopendfree(struct socket *); |
static size_t sodopendfree(struct socket *); |
| static size_t sodopendfreel(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 sokvaunreserve(vsize_t); |
| |
|
| static __inline void |
static __inline vsize_t |
| sokvareserve(struct socket *so, vsize_t len) |
sokvareserve(struct socket *so, vsize_t len) |
| { |
{ |
| int s; |
int s; |
| |
int error; |
| |
|
| s = splvm(); |
s = splvm(); |
| simple_lock(&so_pendfree_slock); |
simple_lock(&so_pendfree_slock); |
| Line 190 sokvareserve(struct socket *so, vsize_t |
|
| Line 191 sokvareserve(struct socket *so, vsize_t |
|
| |
|
| SOSEND_COUNTER_INCR(&sosend_kvalimit); |
SOSEND_COUNTER_INCR(&sosend_kvalimit); |
| sokvawaiters++; |
sokvawaiters++; |
| (void) ltsleep(&socurkva, PVM, "sokva", 0, &so_pendfree_slock); |
error = ltsleep(&socurkva, PVM | PCATCH, "sokva", 0, |
| |
&so_pendfree_slock); |
| sokvawaiters--; |
sokvawaiters--; |
| |
if (error) { |
| |
len = 0; |
| |
break; |
| |
} |
| } |
} |
| socurkva += len; |
socurkva += len; |
| simple_unlock(&so_pendfree_slock); |
simple_unlock(&so_pendfree_slock); |
| splx(s); |
splx(s); |
| |
return len; |
| } |
} |
| |
|
| static __inline void |
static __inline void |
| Line 225 sokvaalloc(vsize_t len, struct socket *s |
|
| Line 232 sokvaalloc(vsize_t len, struct socket *s |
|
| * reserve kva. |
* reserve kva. |
| */ |
*/ |
| |
|
| sokvareserve(so, len); |
if (sokvareserve(so, len) == 0) |
| |
return 0; |
| |
|
| /* |
/* |
| * allocate kva. |
* allocate kva. |
| Line 479 socreate(int dom, struct socket **aso, i |
|
| Line 487 socreate(int dom, struct socket **aso, i |
|
| #endif |
#endif |
| if (p != 0) |
if (p != 0) |
| so->so_uid = p->p_ucred->cr_uid; |
so->so_uid = p->p_ucred->cr_uid; |
| |
else |
| |
so->so_uid = UID_MAX; |
| error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, |
error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, |
| (struct mbuf *)(long)proto, (struct mbuf *)0, p); |
(struct mbuf *)(long)proto, (struct mbuf *)0, p); |
| if (error) { |
if (error) { |
| Line 540 sofree(struct socket *so) |
|
| Line 550 sofree(struct socket *so) |
|
| if (!soqremque(so, 0)) |
if (!soqremque(so, 0)) |
| return; |
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); |
sorflush(so); |
| pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
| } |
} |
| Line 1367 sorflush(struct socket *so) |
|
| Line 1383 sorflush(struct socket *so) |
|
| splx(s); |
splx(s); |
| if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) |
if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) |
| (*pr->pr_domain->dom_dispose)(asb.sb_mb); |
(*pr->pr_domain->dom_dispose)(asb.sb_mb); |
| sbrelease(&asb); |
sbrelease(&asb, so); |
| } |
} |
| |
|
| int |
int |
| Line 1391 sosetopt(struct socket *so, int level, i |
|
| Line 1407 sosetopt(struct socket *so, int level, i |
|
| error = EINVAL; |
error = EINVAL; |
| goto bad; |
goto bad; |
| } |
} |
| if (mtod(m, struct linger *)->l_linger < 0 || |
|
| mtod(m, struct linger *)->l_linger > (INT_MAX / hz)) { |
|
| error = EDOM; |
|
| goto bad; |
|
| } |
|
| so->so_linger = mtod(m, struct linger *)->l_linger; |
so->so_linger = mtod(m, struct linger *)->l_linger; |
| /* fall thru... */ |
/* fall thru... */ |
| |
|
| Line 1446 sosetopt(struct socket *so, int level, i |
|
| Line 1457 sosetopt(struct socket *so, int level, i |
|
| case SO_RCVBUF: |
case SO_RCVBUF: |
| if (sbreserve(optname == SO_SNDBUF ? |
if (sbreserve(optname == SO_SNDBUF ? |
| &so->so_snd : &so->so_rcv, |
&so->so_snd : &so->so_rcv, |
| (u_long) optval) == 0) { |
(u_long) optval, so) == 0) { |
| error = ENOBUFS; |
error = ENOBUFS; |
| goto bad; |
goto bad; |
| } |
} |
| Line 1769 SYSCTL_SETUP(sysctl_kern_somaxkva_setup, |
|
| Line 1780 SYSCTL_SETUP(sysctl_kern_somaxkva_setup, |
|
| |
|
| sysctl_createv(clog, 0, NULL, NULL, |
sysctl_createv(clog, 0, NULL, NULL, |
| CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
| CTLTYPE_INT, "somaxkva", |
CTLTYPE_INT, "somaxkva", NULL, |
| SYSCTL_DESCR("Maximum amount of kernel memory to be " |
|
| "used for socket buffers"), |
|
| sysctl_kern_somaxkva, 0, NULL, 0, |
sysctl_kern_somaxkva, 0, NULL, 0, |
| CTL_KERN, KERN_SOMAXKVA, CTL_EOL); |
CTL_KERN, KERN_SOMAXKVA, CTL_EOL); |
| } |
} |