diff options
author | 2017-01-25 06:15:50 +0000 | |
---|---|---|
committer | 2017-01-25 06:15:50 +0000 | |
commit | dfbeea3123262cd0b43aa302dd27fb952efab121 (patch) | |
tree | 3e3b0db39664e482dbc8de7d0d4ee9de4bb4b223 /sys/kern | |
parent | Construct a BN_gcd_nonct, based on BN_mod_inverse_no_branch, as suggested (diff) | |
download | wireguard-openbsd-dfbeea3123262cd0b43aa302dd27fb952efab121.tar.xz wireguard-openbsd-dfbeea3123262cd0b43aa302dd27fb952efab121.zip |
Enable the NET_LOCK(), take 2.
Recursions are currently known and marked a XXXSMP.
Please report any assert to bugs@
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/sched_bsd.c | 4 | ||||
-rw-r--r-- | sys/kern/uipc_socket.c | 23 | ||||
-rw-r--r-- | sys/kern/uipc_socket2.c | 4 | ||||
-rw-r--r-- | sys/kern/uipc_syscalls.c | 6 | ||||
-rw-r--r-- | sys/kern/uipc_usrreq.c | 13 |
5 files changed, 35 insertions, 15 deletions
diff --git a/sys/kern/sched_bsd.c b/sys/kern/sched_bsd.c index 8b318df5996..fa349bafaab 100644 --- a/sys/kern/sched_bsd.c +++ b/sys/kern/sched_bsd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sched_bsd.c,v 1.43 2016/03/09 13:38:50 mpi Exp $ */ +/* $OpenBSD: sched_bsd.c,v 1.44 2017/01/25 06:15:50 mpi Exp $ */ /* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */ /*- @@ -297,6 +297,8 @@ yield(void) struct proc *p = curproc; int s; + NET_ASSERT_UNLOCKED(); + SCHED_LOCK(s); p->p_priority = p->p_usrpri; p->p_stat = SRUN; diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 245210e594a..06a1340e457 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket.c,v 1.171 2016/12/29 12:12:43 mpi Exp $ */ +/* $OpenBSD: uipc_socket.c,v 1.172 2017/01/25 06:15:50 mpi Exp $ */ /* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */ /* @@ -256,7 +256,7 @@ soclose(struct socket *so) (so->so_state & SS_NBIO)) goto drop; while (so->so_state & SS_ISCONNECTED) { - error = tsleep(&so->so_timeo, + error = rwsleep(&so->so_timeo, &netlock, PSOCK | PCATCH, "netcls", so->so_linger * hz); if (error) @@ -614,8 +614,8 @@ sbsync(struct sockbuf *sb, struct mbuf *nextrecord) * must begin with an address if the protocol so specifies, * followed by an optional mbuf or mbufs containing ancillary data, * and then zero or more mbufs of data. - * In order to avoid blocking network for the entire time here, we splx() - * and release NET_LOCK() while doing the actual copy to user space. + * In order to avoid blocking network for the entire time here, we release + * the NET_LOCK() while doing the actual copy to user space. * Although the sockbuf is locked, new data may still be appended, * and thus we must maintain consistency of the sockbuf during that time. * @@ -800,9 +800,13 @@ dontblock: if (controlp) { if (pr->pr_domain->dom_externalize && mtod(cm, struct cmsghdr *)->cmsg_type == - SCM_RIGHTS) - error = (*pr->pr_domain->dom_externalize)(cm, - controllen, flags); + SCM_RIGHTS) { + NET_UNLOCK(s); + error = + (*pr->pr_domain->dom_externalize) + (cm, controllen, flags); + NET_LOCK(s); + } *controlp = cm; } else { /* @@ -1039,7 +1043,7 @@ sorflush(struct socket *so) struct sockbuf asb; sb->sb_flags |= SB_NOINTR; - (void) sblock(sb, M_WAITOK, NULL); + (void) sblock(sb, M_WAITOK, &netlock); socantrcvmore(so); sbunlock(sb); asb = *sb; @@ -1528,7 +1532,10 @@ sorwakeup(struct socket *so) #endif sowakeup(so, &so->so_rcv); if (so->so_upcall) { + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT); + rw_enter_write(&netlock); } } diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 1ac5f515bc5..b991120eb7a 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket2.c,v 1.70 2016/12/29 12:12:43 mpi Exp $ */ +/* $OpenBSD: uipc_socket2.c,v 1.71 2017/01/25 06:15:50 mpi Exp $ */ /* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */ /* @@ -276,7 +276,7 @@ sbwait(struct sockbuf *sb) NET_ASSERT_LOCKED(); sb->sb_flagsintr |= SB_WAIT; - return (tsleep(&sb->sb_cc, + return (rwsleep(&sb->sb_cc, &netlock, (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, "netio", sb->sb_timeo)); } diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 3efaa23ac0e..482abd5e845 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_syscalls.c,v 1.145 2017/01/24 05:44:09 mpi Exp $ */ +/* $OpenBSD: uipc_syscalls.c,v 1.146 2017/01/25 06:15:50 mpi Exp $ */ /* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */ /* @@ -307,7 +307,7 @@ redo: head->so_error = ECONNABORTED; break; } - error = tsleep(&head->so_timeo, PSOCK | PCATCH, + error = rwsleep(&head->so_timeo, &netlock, PSOCK | PCATCH, "netcon", 0); if (error) goto out; @@ -425,7 +425,7 @@ sys_connect(struct proc *p, void *v, register_t *retval) } NET_LOCK(s); while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) { - error = tsleep(&so->so_timeo, PSOCK | PCATCH, + error = rwsleep(&so->so_timeo, &netlock, PSOCK | PCATCH, "netcon2", 0); if (error) { if (error == EINTR || error == ERESTART) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 4589f903a24..40c9b99bdb2 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_usrreq.c,v 1.111 2017/01/24 04:09:59 deraadt Exp $ */ +/* $OpenBSD: uipc_usrreq.c,v 1.112 2017/01/25 06:15:50 mpi Exp $ */ /* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */ /* @@ -141,7 +141,10 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, break; case PRU_BIND: + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); error = unp_bind(unp, nam, p); + rw_enter_write(&netlock); break; case PRU_LISTEN: @@ -150,7 +153,10 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, break; case PRU_CONNECT: + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); error = unp_connect(so, nam, p); + rw_enter_write(&netlock); break; case PRU_CONNECT2: @@ -218,7 +224,10 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EISCONN; break; } + /* XXXSMP breaks atomicity */ + rw_exit_write(&netlock); error = unp_connect(so, nam, p); + rw_enter_write(&netlock); if (error) break; } else { @@ -495,6 +504,8 @@ unp_connect(struct socket *so, struct mbuf *nam, struct proc *p) struct nameidata nd; int error, s; + NET_ASSERT_UNLOCKED(); + if (soun->sun_family != AF_UNIX) return (EAFNOSUPPORT); |