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.205.2.1 retrieving revision 1.206 diff -u -p -r1.205.2.1 -r1.206 --- src/sys/kern/uipc_socket.c 2012/04/17 00:08:30 1.205.2.1 +++ src/sys/kern/uipc_socket.c 2011/12/20 23:56:28 1.206 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.205.2.1 2012/04/17 00:08:30 yamt Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.206 2011/12/20 23:56:28 christos Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.205.2.1 2012/04/17 00:08:30 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.206 2011/12/20 23:56:28 christos Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -136,6 +136,8 @@ EVCNT_ATTACH_STATIC(sosend_kvalimit); #endif /* SOSEND_COUNTERS */ +static struct callback_entry sokva_reclaimerentry; + #if defined(SOSEND_NO_LOAN) || defined(MULTIPROCESSOR) int sock_loan_thresh = -1; #else @@ -197,7 +199,7 @@ sokvaunreserve(vsize_t len) */ vaddr_t -sokvaalloc(vaddr_t sva, vsize_t len, struct socket *so) +sokvaalloc(vsize_t len, struct socket *so) { vaddr_t lva; @@ -212,8 +214,7 @@ sokvaalloc(vaddr_t sva, vsize_t len, str * allocate kva. */ - lva = uvm_km_alloc(kernel_map, len, atop(sva) & uvmexp.colormask, - UVM_KMF_COLORMATCH | UVM_KMF_VAONLY | UVM_KMF_WAITVA); + lva = uvm_km_alloc(kernel_map, len, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); if (lva == 0) { sokvaunreserve(len); return (0); @@ -350,7 +351,7 @@ sosend_loan(struct socket *so, struct ui KASSERT(npgs <= M_EXT_MAXPAGES); - lva = sokvaalloc(sva, len, so); + lva = sokvaalloc(len, so); if (lva == 0) return 0; @@ -383,6 +384,19 @@ sosend_loan(struct socket *so, struct ui return (space); } +static int +sokva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg) +{ + + KASSERT(ce == &sokva_reclaimerentry); + KASSERT(obj == NULL); + + if (!vm_map_starved_p(kernel_map)) { + return CALLBACK_CHAIN_ABORT; + } + return CALLBACK_CHAIN_CONTINUE; +} + struct mbuf * getsombuf(struct socket *so, int type) { @@ -465,6 +479,9 @@ soinit(void) if (sb_max_set(sb_max)) panic("bad initial sb_max value: %lu", sb_max); + callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback, + &sokva_reclaimerentry, NULL, sokva_reclaim_callback); + socket_listener = kauth_listen_scope(KAUTH_SCOPE_NETWORK, socket_listener_cb, NULL); } @@ -572,8 +589,7 @@ fsocreate(int domain, struct socket **so if ((error = fd_allocfile(&fp, &fd)) != 0) return error; fd_set_exclose(l, fd, (flags & SOCK_CLOEXEC) != 0); - fp->f_flag = FREAD|FWRITE|((flags & SOCK_NONBLOCK) ? FNONBLOCK : 0)| - ((flags & SOCK_NOSIGPIPE) ? FNOSIGPIPE : 0); + fp->f_flag = FREAD|FWRITE|((flags & SOCK_NONBLOCK) ? FNONBLOCK : 0); fp->f_type = DTYPE_SOCKET; fp->f_ops = &socketops; error = socreate(domain, &so, type, protocol, l, NULL); @@ -622,7 +638,7 @@ solisten(struct socket *so, int backlog, if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) != 0) { sounlock(so); - return (EINVAL); + return (EOPNOTSUPP); } error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, NULL, NULL, NULL, l); @@ -1703,7 +1719,6 @@ sosetopt1(struct socket *so, const struc case SO_REUSEPORT: case SO_OOBINLINE: case SO_TIMESTAMP: - case SO_NOSIGPIPE: #ifdef SO_OTIMESTAMP case SO_OTIMESTAMP: #endif @@ -1904,7 +1919,6 @@ sogetopt1(struct socket *so, struct sock case SO_BROADCAST: case SO_OOBINLINE: case SO_TIMESTAMP: - case SO_NOSIGPIPE: #ifdef SO_OTIMESTAMP case SO_OTIMESTAMP: #endif