Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys - Eliminate so_nbio and turn it into a bit SS_NBIO in so...



details:   https://anonhg.NetBSD.org/src/rev/757762007764
branches:  trunk
changeset: 772157:757762007764
user:      christos <christos%NetBSD.org@localhost>
date:      Tue Dec 20 23:56:28 2011 +0000

description:
- 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?).

diffstat:

 sys/compat/linux/common/linux_socket.c |  10 +++++-----
 sys/dev/kttcp.c                        |   8 ++++----
 sys/kern/sys_socket.c                  |  12 ++++++++----
 sys/kern/uipc_socket.c                 |  12 +++++++-----
 sys/kern/uipc_socket2.c                |   5 ++---
 sys/kern/uipc_syscalls.c               |   8 ++++----
 sys/miscfs/fifofs/fifo_vnops.c         |  27 +++++++++------------------
 sys/netiso/tp_usrreq.c                 |   8 ++++----
 sys/sys/socket.h                       |   3 ++-
 sys/sys/socketvar.h                    |   4 ++--
 10 files changed, 47 insertions(+), 50 deletions(-)

diffs (truncated from 375 to 300 lines):

diff -r effb7b40b7eb -r 757762007764 sys/compat/linux/common/linux_socket.c
--- a/sys/compat/linux/common/linux_socket.c    Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/compat/linux/common/linux_socket.c    Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
 
        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 @@
 
                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 @@
                 * 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;
        }
diff -r effb7b40b7eb -r 757762007764 sys/dev/kttcp.c
--- a/sys/dev/kttcp.c   Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/dev/kttcp.c   Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
                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 @@
                }
                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;
                }
diff -r effb7b40b7eb -r 757762007764 sys/kern/sys_socket.c
--- a/sys/kern/sys_socket.c     Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/kern/sys_socket.c     Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
        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:
diff -r effb7b40b7eb -r 757762007764 sys/kern/uipc_socket.c
--- a/sys/kern/uipc_socket.c    Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/kern/uipc_socket.c    Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
                                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 @@
                }
                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 @@
                }
                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;
                }
diff -r effb7b40b7eb -r 757762007764 sys/kern/uipc_socket2.c
--- a/sys/kern/uipc_socket2.c   Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/kern/uipc_socket2.c   Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
        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;
diff -r effb7b40b7eb -r 757762007764 sys/kern/uipc_syscalls.c
--- a/sys/kern/uipc_syscalls.c  Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/kern/uipc_syscalls.c  Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
                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 @@
        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;
        }
diff -r effb7b40b7eb -r 757762007764 sys/miscfs/fifofs/fifo_vnops.c
--- a/sys/miscfs/fifofs/fifo_vnops.c    Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/miscfs/fifofs/fifo_vnops.c    Tue Dec 20 23:56:28 2011 +0000
@@ -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 @@
        } */ *ap = v;
        struct uio      *uio;
        struct socket   *rso;
-       int             error;
+       int             error, sflags;
        size_t          startresid;
 
        uio = ap->a_uio;
@@ -256,18 +256,14 @@
                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 @@
                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 @@
                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);
 }
diff -r effb7b40b7eb -r 757762007764 sys/netiso/tp_usrreq.c
--- a/sys/netiso/tp_usrreq.c    Tue Dec 20 22:48:59 2011 +0000
+++ b/sys/netiso/tp_usrreq.c    Tue Dec 20 23:56:28 2011 +0000



Home | Main Index | Thread Index | Old Index