Index: kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.150 diff -u -p -r1.150 uipc_socket.c --- kern/uipc_socket.c 14 Mar 2016 23:08:06 -0000 1.150 +++ kern/uipc_socket.c 12 May 2016 11:19:46 -0000 @@ -1445,15 +1445,18 @@ somove(struct socket *so, int wait) void sorwakeup(struct socket *so) { + int wake = 1; + #ifdef SOCKET_SPLICE if (so->so_rcv.sb_flagsintr & SB_SPLICE) (void) somove(so, M_DONTWAIT); if (isspliced(so)) return; #endif - sowakeup(so, &so->so_rcv); if (so->so_upcall) - (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT); + wake = (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT); + if (wake) + sowakeup(so, &so->so_rcv); } void Index: nfs/nfs_socket.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_socket.c,v retrieving revision 1.111 diff -u -p -r1.111 nfs_socket.c --- nfs/nfs_socket.c 24 Aug 2015 14:00:29 -0000 1.111 +++ nfs/nfs_socket.c 12 May 2016 11:19:46 -0000 @@ -1559,17 +1559,17 @@ nfs_msg(struct nfsreq *rep, char *msg) * Essentially do as much as possible non-blocking, else punt and it will * be called with M_WAIT from an nfsd. */ -void -nfsrv_rcv(struct socket *so, caddr_t arg, int waitflag) +int +nfsrv_rcv(struct socket *so, void *arg, int waitflag) { - struct nfssvc_sock *slp = (struct nfssvc_sock *)arg; + struct nfssvc_sock *slp = arg; struct mbuf *m; struct mbuf *mp, *nam; struct uio auio; int flags, error; if ((slp->ns_flag & SLP_VALID) == 0) - return; + return (1); #ifdef notdef /* * Define this to test for nfsds handling this under heavy load. @@ -1662,6 +1662,8 @@ dorecs: if (waitflag == M_DONTWAIT && (slp->ns_rec || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) nfsrv_wakenfsd(slp); + + return (0); } /* Index: nfs/nfs_syscalls.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_syscalls.c,v retrieving revision 1.104 diff -u -p -r1.104 nfs_syscalls.c --- nfs/nfs_syscalls.c 4 Sep 2015 11:50:33 -0000 1.104 +++ nfs/nfs_syscalls.c 12 May 2016 11:19:46 -0000 @@ -279,8 +279,8 @@ nfssvc_addsock(struct file *fp, struct m fp->f_count++; slp->ns_fp = fp; s = splsoftnet(); - so->so_upcallarg = (caddr_t)slp; so->so_upcall = nfsrv_rcv; + so->so_upcallarg = slp; slp->ns_flag = (SLP_VALID | SLP_NEEDQ); nfsrv_wakenfsd(slp); splx(s); Index: nfs/nfs_var.h =================================================================== RCS file: /cvs/src/sys/nfs/nfs_var.h,v retrieving revision 1.61 diff -u -p -r1.61 nfs_var.h --- nfs/nfs_var.h 29 Apr 2016 14:40:36 -0000 1.61 +++ nfs/nfs_var.h 12 May 2016 11:19:46 -0000 @@ -193,7 +193,7 @@ int nfs_rcvlock(struct nfsreq *); void nfs_rcvunlock(int *); int nfs_getreq(struct nfsrv_descript *, struct nfsd *, int); void nfs_msg(struct nfsreq *, char *); -void nfsrv_rcv(struct socket *, caddr_t, int); +int nfsrv_rcv(struct socket *, void *, int); int nfsrv_getstream(struct nfssvc_sock *, int); int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *, struct nfsrv_descript **); Index: sys/socketvar.h =================================================================== RCS file: /cvs/src/sys/sys/socketvar.h,v retrieving revision 1.60 diff -u -p -r1.60 socketvar.h --- sys/socketvar.h 25 Feb 2016 07:39:09 -0000 1.60 +++ sys/socketvar.h 12 May 2016 11:19:46 -0000 @@ -122,8 +122,8 @@ struct socket { #define SB_NOINTR 0x40 /* operations not interruptible */ #define SB_KNOTE 0x80 /* kernel note attached */ - void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); - caddr_t so_upcallarg; /* Arg for above */ + int (*so_upcall)(struct socket *so, void *arg, int waitf); + void * so_upcallarg; /* Arg for above */ uid_t so_euid, so_ruid; /* who opened the socket */ gid_t so_egid, so_rgid; pid_t so_cpid; /* pid of process that opened socket */