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