Module Name: src Committed By: christos Date: Tue Dec 20 23:56:29 UTC 2011
Modified Files: src/sys/compat/linux/common: linux_socket.c src/sys/dev: kttcp.c src/sys/kern: sys_socket.c uipc_socket.c uipc_socket2.c uipc_syscalls.c src/sys/miscfs/fifofs: fifo_vnops.c src/sys/netiso: tp_usrreq.c src/sys/sys: socket.h socketvar.h Log Message: - Eliminate so_nbio and turn it into a bit SS_NBIO in so_state. - Introduce MSG_NBIO so that we can turn non blocking i/o on a per call basis - Use MSG_NBIO to fix the XXX: multi-threaded issues on the fifo sockets. - Don't set SO_CANTRCVMORE, if we were interrupted (perhaps do it for all errors?). To generate a diff of this commit: cvs rdiff -u -r1.110 -r1.111 src/sys/compat/linux/common/linux_socket.c cvs rdiff -u -r1.28 -r1.29 src/sys/dev/kttcp.c cvs rdiff -u -r1.64 -r1.65 src/sys/kern/sys_socket.c cvs rdiff -u -r1.205 -r1.206 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.109 -r1.110 src/sys/kern/uipc_socket2.c cvs rdiff -u -r1.148 -r1.149 src/sys/kern/uipc_syscalls.c cvs rdiff -u -r1.70 -r1.71 src/sys/miscfs/fifofs/fifo_vnops.c cvs rdiff -u -r1.40 -r1.41 src/sys/netiso/tp_usrreq.c cvs rdiff -u -r1.100 -r1.101 src/sys/sys/socket.h cvs rdiff -u -r1.126 -r1.127 src/sys/sys/socketvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/common/linux_socket.c diff -u src/sys/compat/linux/common/linux_socket.c:1.110 src/sys/compat/linux/common/linux_socket.c:1.111 --- src/sys/compat/linux/common/linux_socket.c:1.110 Sun Jul 17 19:59:54 2011 +++ src/sys/compat/linux/common/linux_socket.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.c,v 1.110 2011/07/17 23:59:54 christos Exp $ */ +/* $NetBSD: linux_socket.c,v 1.111 2011/12/20 23:56:28 christos Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.110 2011/07/17 23:59:54 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.111 2011/12/20 23:56:28 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -1376,7 +1376,7 @@ linux_sys_connect(struct lwp *l, const s if (error == EISCONN) { struct socket *so; - int state, prflags, nbio; + int state, prflags; /* fd_getsock() will use the descriptor for us */ if (fd_getsock(SCARG(uap, s), &so) != 0) @@ -1384,7 +1384,6 @@ linux_sys_connect(struct lwp *l, const s solock(so); state = so->so_state; - nbio = so->so_nbio; prflags = so->so_proto->pr_flags; sounlock(so); fd_putfile(SCARG(uap, s)); @@ -1393,7 +1392,8 @@ linux_sys_connect(struct lwp *l, const s * non-blocking connect; however we don't have * a convenient place to keep that state.. */ - if (nbio && (state & SS_ISCONNECTED) && + if ((state & (SS_ISCONNECTED|SS_NBIO)) == + (SS_ISCONNECTED|SS_NBIO) && (prflags & PR_CONNREQUIRED)) return 0; } Index: src/sys/dev/kttcp.c diff -u src/sys/dev/kttcp.c:1.28 src/sys/dev/kttcp.c:1.29 --- src/sys/dev/kttcp.c:1.28 Thu Apr 24 07:38:36 2008 +++ src/sys/dev/kttcp.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kttcp.c,v 1.28 2008/04/24 11:38:36 ad Exp $ */ +/* $NetBSD: kttcp.c,v 1.29 2011/12/20 23:56:28 christos Exp $ */ /* * Copyright (c) 2002 Wasabi Systems, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.28 2008/04/24 11:38:36 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.29 2011/12/20 23:56:28 christos Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -237,7 +237,7 @@ kttcp_sosend(struct socket *so, unsigned if ((atomic && resid > so->so_snd.sb_hiwat)) snderr(EMSGSIZE); if (space < resid && (atomic || space < so->so_snd.sb_lowat)) { - if (so->so_nbio) + if (so->so_state & SS_NBIO) snderr(EWOULDBLOCK); SBLASTRECORDCHK(&so->so_rcv, "kttcp_soreceive sbwait 1"); @@ -427,7 +427,7 @@ kttcp_soreceive(struct socket *so, unsig } if (resid == 0) goto release; - if (so->so_nbio || (flags & MSG_DONTWAIT)) { + if ((so->so_so_state & SS_NBIO) || (flags & MSG_DONTWAIT|MSG_NBIO)) { error = EWOULDBLOCK; goto release; } Index: src/sys/kern/sys_socket.c diff -u src/sys/kern/sys_socket.c:1.64 src/sys/kern/sys_socket.c:1.65 --- src/sys/kern/sys_socket.c:1.64 Thu Jun 30 18:38:50 2011 +++ src/sys/kern/sys_socket.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_socket.c,v 1.64 2011/06/30 22:38:50 dyoung Exp $ */ +/* $NetBSD: sys_socket.c,v 1.65 2011/12/20 23:56:28 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.64 2011/06/30 22:38:50 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.65 2011/12/20 23:56:28 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -127,8 +127,12 @@ soo_ioctl(file_t *fp, u_long cmd, void * switch (cmd) { case FIONBIO: - /* No reason to lock and this call is made very often. */ - so->so_nbio = *(int *)data; + solock(so); + if (*(int *)data) + so->so_state |= SS_NBIO; + else + so->so_state &= ~SS_NBIO; + sounlock(so); break; case FIOASYNC: Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.205 src/sys/kern/uipc_socket.c:1.206 --- src/sys/kern/uipc_socket.c:1.205 Sat Jul 2 13:53:50 2011 +++ src/sys/kern/uipc_socket.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.205 2011/07/02 17:53:50 bouyer 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 <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.205 2011/07/02 17:53:50 bouyer 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" @@ -741,7 +741,8 @@ soclose(struct socket *so) goto drop; } if (so->so_options & SO_LINGER) { - if ((so->so_state & SS_ISDISCONNECTING) && so->so_nbio) + if ((so->so_state & (SS_ISDISCONNECTING|SS_NBIO)) == + (SS_ISDISCONNECTING|SS_NBIO)) goto drop; while (so->so_state & SS_ISCONNECTED) { error = sowait(so, true, so->so_linger * hz); @@ -961,7 +962,7 @@ sosend(struct socket *so, struct mbuf *a } if (space < resid + clen && (atomic || space < so->so_snd.sb_lowat || space < clen)) { - if (so->so_nbio) { + if ((so->so_state & SS_NBIO) || (flags & MSG_NBIO)) { error = EWOULDBLOCK; goto release; } @@ -1257,7 +1258,8 @@ soreceive(struct socket *so, struct mbuf } if (uio->uio_resid == 0) goto release; - if (so->so_nbio || (flags & MSG_DONTWAIT)) { + if ((so->so_state & SS_NBIO) || + (flags & (MSG_DONTWAIT|MSG_NBIO))) { error = EWOULDBLOCK; goto release; } Index: src/sys/kern/uipc_socket2.c diff -u src/sys/kern/uipc_socket2.c:1.109 src/sys/kern/uipc_socket2.c:1.110 --- src/sys/kern/uipc_socket2.c:1.109 Wed Aug 31 14:31:03 2011 +++ src/sys/kern/uipc_socket2.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket2.c,v 1.109 2011/08/31 18:31:03 plunky Exp $ */ +/* $NetBSD: uipc_socket2.c,v 1.110 2011/12/20 23:56:28 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.109 2011/08/31 18:31:03 plunky Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.110 2011/12/20 23:56:28 christos Exp $"); #include "opt_mbuftrace.h" #include "opt_sb_max.h" @@ -265,7 +265,6 @@ sonewconn(struct socket *head, int conns so->so_options = head->so_options &~ SO_ACCEPTCONN; so->so_linger = head->so_linger; so->so_state = head->so_state | SS_NOFDREF; - so->so_nbio = head->so_nbio; so->so_proto = head->so_proto; so->so_timeo = head->so_timeo; so->so_pgid = head->so_pgid; Index: src/sys/kern/uipc_syscalls.c diff -u src/sys/kern/uipc_syscalls.c:1.148 src/sys/kern/uipc_syscalls.c:1.149 --- src/sys/kern/uipc_syscalls.c:1.148 Thu Nov 3 22:13:08 2011 +++ src/sys/kern/uipc_syscalls.c Tue Dec 20 18:56:28 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.148 2011/11/04 02:13:08 christos Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.149 2011/12/20 23:56:28 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.148 2011/11/04 02:13:08 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.149 2011/12/20 23:56:28 christos Exp $"); #include "opt_pipe.h" @@ -198,7 +198,7 @@ do_sys_accept(struct lwp *l, int sock, s error = EINVAL; goto bad; } - if (so->so_nbio && so->so_qlen == 0) { + if ((so->so_state & SS_NBIO) && so->so_qlen == 0) { error = EWOULDBLOCK; goto bad; } @@ -367,7 +367,7 @@ do_sys_connect(struct lwp *l, int fd, st error = soconnect(so, nam, l); if (error) goto bad; - if (so->so_nbio && (so->so_state & SS_ISCONNECTING) != 0) { + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING) != 0) { error = EINPROGRESS; goto out; } Index: src/sys/miscfs/fifofs/fifo_vnops.c diff -u src/sys/miscfs/fifofs/fifo_vnops.c:1.70 src/sys/miscfs/fifofs/fifo_vnops.c:1.71 --- src/sys/miscfs/fifofs/fifo_vnops.c:1.70 Wed Aug 31 14:31:03 2011 +++ src/sys/miscfs/fifofs/fifo_vnops.c Tue Dec 20 18:56:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: fifo_vnops.c,v 1.70 2011/08/31 18:31:03 plunky Exp $ */ +/* $NetBSD: fifo_vnops.c,v 1.71 2011/12/20 23:56:29 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.70 2011/08/31 18:31:03 plunky Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.71 2011/12/20 23:56:29 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -243,7 +243,7 @@ fifo_read(void *v) } */ *ap = v; struct uio *uio; struct socket *rso; - int error; + int error, sflags; size_t startresid; uio = ap->a_uio; @@ -256,18 +256,14 @@ fifo_read(void *v) return (0); startresid = uio->uio_resid; VOP_UNLOCK(ap->a_vp); - if (ap->a_ioflag & IO_NDELAY) { - /* XXX Bogus, affects other threads. */ - rso->so_nbio = 1; - } - error = (*rso->so_receive)(rso, NULL, uio, NULL, NULL, NULL); + sflags = (ap->a_ioflag & IO_NDELAY) ? MSG_NBIO : 0; + error = (*rso->so_receive)(rso, NULL, uio, NULL, NULL, &sflags); /* * Clear EOF indication after first such return. */ - if (uio->uio_resid == startresid) + if (error != EINTR && uio->uio_resid == startresid) rso->so_state &= ~SS_CANTRCVMORE; if (ap->a_ioflag & IO_NDELAY) { - rso->so_nbio = 0; if (error == EWOULDBLOCK && ap->a_vp->v_fifoinfo->fi_writers == 0) error = 0; @@ -290,7 +286,7 @@ fifo_write(void *v) kauth_cred_t a_cred; } */ *ap = v; struct socket *wso; - int error; + int error, sflags; wso = ap->a_vp->v_fifoinfo->fi_writesock; #ifdef DIAGNOSTIC @@ -298,13 +294,8 @@ fifo_write(void *v) panic("fifo_write mode"); #endif VOP_UNLOCK(ap->a_vp); - if (ap->a_ioflag & IO_NDELAY) { - /* XXX Bogus, affects other threads. */ - wso->so_nbio = 1; - } - error = (*wso->so_send)(wso, NULL, ap->a_uio, 0, NULL, 0, curlwp); - if (ap->a_ioflag & IO_NDELAY) - wso->so_nbio = 0; + sflags = (ap->a_ioflag & IO_NDELAY) ? MSG_NBIO : 0; + error = (*wso->so_send)(wso, NULL, ap->a_uio, 0, NULL, sflags, curlwp); vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY); return (error); } Index: src/sys/netiso/tp_usrreq.c diff -u src/sys/netiso/tp_usrreq.c:1.40 src/sys/netiso/tp_usrreq.c:1.41 --- src/sys/netiso/tp_usrreq.c:1.40 Wed Mar 18 18:08:57 2009 +++ src/sys/netiso/tp_usrreq.c Tue Dec 20 18:56:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: tp_usrreq.c,v 1.40 2009/03/18 22:08:57 he Exp $ */ +/* $NetBSD: tp_usrreq.c,v 1.41 2011/12/20 23:56:29 christos Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -65,7 +65,7 @@ SOFTWARE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tp_usrreq.c,v 1.40 2009/03/18 22:08:57 he Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tp_usrreq.c,v 1.41 2011/12/20 23:56:29 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -212,7 +212,7 @@ restart: } #endif sbunlock(sb); - if (so->so_nbio) { + if (so->so_state & SS_NBIO) { return EWOULDBLOCK; } sbwait(sb); @@ -306,7 +306,7 @@ tp_sendoob(struct tp_pcb *tpcb, struct s */ if (sb->sb_mb) { /* Anything already in eXpedited data * sockbuf? */ - if (so->so_nbio) { + if (so->so_state & SS_NBIO) { return EWOULDBLOCK; } while (sb->sb_mb) { Index: src/sys/sys/socket.h diff -u src/sys/sys/socket.h:1.100 src/sys/sys/socket.h:1.101 --- src/sys/sys/socket.h:1.100 Sun Jun 26 12:43:12 2011 +++ src/sys/sys/socket.h Tue Dec 20 18:56:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: socket.h,v 1.100 2011/06/26 16:43:12 christos Exp $ */ +/* $NetBSD: socket.h,v 1.101 2011/12/20 23:56:29 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -492,6 +492,7 @@ struct msghdr { #define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */ #if defined(_NETBSD_SOURCE) #define MSG_CMSG_CLOEXEC 0x0800 /* close on exec receiving fd */ +#define MSG_NBIO 0x1000 /* use non-blocking I/O */ #endif /* Extra flags used internally only */ Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.126 src/sys/sys/socketvar.h:1.127 --- src/sys/sys/socketvar.h:1.126 Sat Jul 2 13:53:51 2011 +++ src/sys/sys/socketvar.h Tue Dec 20 18:56:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.126 2011/07/02 17:53:51 bouyer Exp $ */ +/* $NetBSD: socketvar.h,v 1.127 2011/12/20 23:56:29 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -128,7 +128,6 @@ struct socket { short so_options; /* from socket call, see socket.h */ u_short so_linger; /* time to linger while closing */ short so_state; /* internal state flags SS_*, below */ - int so_nbio; /* non-blocking I/O enabled */ void *so_pcb; /* protocol control block */ const struct protosw *so_proto; /* protocol handle */ /* @@ -210,6 +209,7 @@ do { \ * more data coming */ #define SS_ISAPIPE 0x1000 /* socket is implementing a pipe */ +#define SS_NBIO 0x2000 /* socket is in non blocking I/O */ #ifdef _KERNEL