diff options
author | Seigo Tanimura <tanimura@FreeBSD.org> | 2002-05-31 11:52:35 +0000 |
---|---|---|
committer | Seigo Tanimura <tanimura@FreeBSD.org> | 2002-05-31 11:52:35 +0000 |
commit | 4cc20ab1f0f3d1126126327aa298ab88c974c53d (patch) | |
tree | 9d5f24794525313566896ab89aa860515db344a6 /sys/kern | |
parent | c82593cf2c9a5b4ccd2be043f6c9ccc8af22fcc9 (diff) | |
download | src-4cc20ab1f0f3d1126126327aa298ab88c974c53d.tar.gz src-4cc20ab1f0f3d1126126327aa298ab88c974c53d.zip |
Back out my lats commit of locking down a socket, it conflicts with hsu's work.
Requested by: hsu
Notes
Notes:
svn path=/head/; revision=97658
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_descrip.c | 7 | ||||
-rw-r--r-- | sys/kern/sys_socket.c | 8 | ||||
-rw-r--r-- | sys/kern/uipc_domain.c | 8 | ||||
-rw-r--r-- | sys/kern/uipc_sockbuf.c | 127 | ||||
-rw-r--r-- | sys/kern/uipc_socket.c | 208 | ||||
-rw-r--r-- | sys/kern/uipc_socket2.c | 127 | ||||
-rw-r--r-- | sys/kern/uipc_syscalls.c | 37 | ||||
-rw-r--r-- | sys/kern/uipc_usrreq.c | 35 | ||||
-rw-r--r-- | sys/kern/vfs_aio.c | 3 |
9 files changed, 158 insertions, 402 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 8a6176dac751..15837d304e8d 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -1777,22 +1777,19 @@ fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp) *spp = (struct socket *)fp->f_data; if (fflagp) *fflagp = fp->f_flag; - SOCK_LOCK(*spp); soref(*spp); - SOCK_UNLOCK(*spp); } FILEDESC_UNLOCK(td->td_proc->p_fd); return(error); } /* - * Drop the reference count on the the socket and release the lock. - * The last reference closes the socket. The socket must be unlocked. + * Drop the reference count on the the socket and XXX release the SX lock in + * the future. The last reference closes the socket. */ void fputsock(struct socket *so) { - SOCK_LOCK(so); sorele(so); } diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index 6c1a23c1500c..c8a6198def6b 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -104,16 +104,13 @@ soo_ioctl(fp, cmd, data, td) switch (cmd) { case FIONBIO: - SOCK_LOCK(so); if (*(int *)data) so->so_state |= SS_NBIO; else so->so_state &= ~SS_NBIO; - SOCK_UNLOCK(so); return (0); case FIOASYNC: - SOCK_LOCK(so); if (*(int *)data) { so->so_state |= SS_ASYNC; so->so_rcv.sb_flags |= SB_ASYNC; @@ -123,7 +120,6 @@ soo_ioctl(fp, cmd, data, td) so->so_rcv.sb_flags &= ~SB_ASYNC; so->so_snd.sb_flags &= ~SB_ASYNC; } - SOCK_UNLOCK(so); return (0); case FIONREAD: @@ -145,9 +141,7 @@ soo_ioctl(fp, cmd, data, td) return (0); case SIOCATMARK: - SOCK_LOCK(so); *(int *)data = (so->so_state&SS_RCVATMARK) != 0; - SOCK_UNLOCK(so); return (0); } /* @@ -187,13 +181,11 @@ soo_stat(fp, ub, td) * If SS_CANTRCVMORE is set, but there's still data left in the * receive buffer, the socket is still readable. */ - SOCK_LOCK(so); if ((so->so_state & SS_CANTRCVMORE) == 0 || so->so_rcv.sb_cc != 0) ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH; if ((so->so_state & SS_CANTSENDMORE) == 0) ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; - SOCK_UNLOCK(so); ub->st_size = so->so_rcv.sb_cc; ub->st_uid = so->so_cred->cr_uid; ub->st_gid = so->so_cred->cr_gid; diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c index cfb77687e225..b8321eba4fb4 100644 --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -35,13 +35,11 @@ */ #include <sys/param.h> +#include <sys/socket.h> +#include <sys/protosw.h> #include <sys/domain.h> -#include <sys/kernel.h> -#include <sys/lock.h> #include <sys/mbuf.h> -#include <sys/mutex.h> -#include <sys/protosw.h> -#include <sys/socket.h> +#include <sys/kernel.h> #include <sys/socketvar.h> #include <sys/systm.h> #include <vm/uma.h> diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index 2a7c3433ab89..c8daa0903d09 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -102,56 +102,71 @@ soisconnecting(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= SS_ISCONNECTING; } void -soisconnected(so) +soisconnected_locked(so) struct socket *so; { - struct socket *head; - so_upcall_t *upcp; - void *upcarg; + struct socket *head = so->so_head; - SOCK_ASSERT(so, MA_OWNED); - head = so->so_head; so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); so->so_state |= SS_ISCONNECTED; if (head && (so->so_state & SS_INCOMP)) { if ((so->so_options & SO_ACCEPTFILTER) != 0) { - SOCK_UNLOCK(so); - SOCK_LOCK(head); - upcp = head->so_accf->so_accept_filter->accf_callback; - upcarg = head->so_accf->so_accept_filter_arg; - SOCK_UNLOCK(head); - SOCK_LOCK(so); - so->so_upcall = upcp; - so->so_upcallarg = upcarg; + so->so_upcall = head->so_accf->so_accept_filter->accf_callback; + so->so_upcallarg = head->so_accf->so_accept_filter_arg; so->so_rcv.sb_flags |= SB_UPCALL; so->so_options &= ~SO_ACCEPTFILTER; - SOCK_UNLOCK(so); - so->so_upcall(so, upcarg, 0); - SOCK_LOCK(so); + so->so_upcall(so, so->so_upcallarg, 0); return; } + TAILQ_REMOVE(&head->so_incomp, so, so_list); + head->so_incqlen--; so->so_state &= ~SS_INCOMP; + TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); + head->so_qlen++; so->so_state |= SS_COMP; - SOCK_UNLOCK(so); - SOCK_LOCK(head); + sorwakeup_locked(head); + wakeup_one(&head->so_timeo); + } else { + wakeup(&so->so_timeo); + sorwakeup_locked(so); + sowwakeup_locked(so); + } +} + +void +soisconnected(so) + struct socket *so; +{ + struct socket *head = so->so_head; + + so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); + so->so_state |= SS_ISCONNECTED; + if (head && (so->so_state & SS_INCOMP)) { + if ((so->so_options & SO_ACCEPTFILTER) != 0) { + so->so_upcall = head->so_accf->so_accept_filter->accf_callback; + so->so_upcallarg = head->so_accf->so_accept_filter_arg; + so->so_rcv.sb_flags |= SB_UPCALL; + so->so_options &= ~SO_ACCEPTFILTER; + so->so_upcall(so, so->so_upcallarg, 0); + return; + } TAILQ_REMOVE(&head->so_incomp, so, so_list); head->so_incqlen--; + so->so_state &= ~SS_INCOMP; TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); head->so_qlen++; - sorwakeup(head); + so->so_state |= SS_COMP; + sorwakeup_locked(head); wakeup_one(&head->so_timeo); - SOCK_UNLOCK(head); - SOCK_LOCK(so); } else { wakeup(&so->so_timeo); - sorwakeup(so); - sowwakeup(so); + sorwakeup_locked(so); + sowwakeup_locked(so); } } @@ -160,25 +175,31 @@ soisdisconnecting(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~SS_ISCONNECTING; so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); + sowwakeup_locked(so); + sorwakeup_locked(so); } void -soisdisconnected(so) +soisdisconnected_locked(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE|SS_ISDISCONNECTED); wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); + sowwakeup_locked(so); + sorwakeup_locked(so); +} + +void +soisdisconnected(so) + register struct socket *so; +{ + + soisdisconnected_locked(so); } /* @@ -203,32 +224,25 @@ sonewconn(head, connstatus) so = soalloc(0); if (so == NULL) return ((struct socket *)0); - SOCK_LOCK(head); if ((head->so_options & SO_ACCEPTFILTER) != 0) connstatus = 0; - SOCK_UNLOCK(head); so->so_head = head; so->so_type = head->so_type; - SOCK_LOCK(so); so->so_options = head->so_options &~ SO_ACCEPTCONN; so->so_linger = head->so_linger; so->so_state = head->so_state | SS_NOFDREF; - SOCK_UNLOCK(so); so->so_proto = head->so_proto; so->so_timeo = head->so_timeo; so->so_cred = crhold(head->so_cred); if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat) || (*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) { - SOCK_LOCK(so); sotryfree(so); return ((struct socket *)0); } if (connstatus) { TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); - SOCK_LOCK(so); so->so_state |= SS_COMP; - SOCK_UNLOCK(so); head->so_qlen++; } else { if (head->so_incqlen > head->so_qlimit) { @@ -237,19 +251,13 @@ sonewconn(head, connstatus) (void) soabort(sp); } TAILQ_INSERT_TAIL(&head->so_incomp, so, so_list); - SOCK_LOCK(so); so->so_state |= SS_INCOMP; - SOCK_UNLOCK(so); head->so_incqlen++; } if (connstatus) { - SOCK_LOCK(head); - sorwakeup(head); + sorwakeup_locked(head); wakeup((caddr_t)&head->so_timeo); - SOCK_UNLOCK(head); - SOCK_LOCK(so); so->so_state |= connstatus; - SOCK_UNLOCK(so); } return (so); } @@ -269,10 +277,8 @@ socantsendmore(so) struct socket *so; { - SOCK_LOCK(so); so->so_state |= SS_CANTSENDMORE; - sowwakeup(so); - SOCK_UNLOCK(so); + sowwakeup_locked(so); } void @@ -280,10 +286,8 @@ socantrcvmore(so) struct socket *so; { - SOCK_LOCK(so); so->so_state |= SS_CANTRCVMORE; - sorwakeup(so); - SOCK_UNLOCK(so); + sorwakeup_locked(so); } /* @@ -332,7 +336,6 @@ sowakeup(so, sb) register struct socket *so; register struct sockbuf *sb; { - SOCK_ASSERT(so, MA_OWNED); selwakeup(&sb->sb_sel); sb->sb_flags &= ~SB_SEL; @@ -340,23 +343,13 @@ sowakeup(so, sb) sb->sb_flags &= ~SB_WAIT; wakeup((caddr_t)&sb->sb_cc); } - if ((so->so_state & SS_ASYNC) && so->so_sigio != NULL) { - SOCK_UNLOCK(so); + if ((so->so_state & SS_ASYNC) && so->so_sigio != NULL) pgsigio(&so->so_sigio, SIGIO, 0); - SOCK_LOCK(so); - } - if (sb->sb_flags & SB_UPCALL) { - SOCK_UNLOCK(so); + if (sb->sb_flags & SB_UPCALL) (*so->so_upcall)(so, so->so_upcallarg, M_DONTWAIT); - SOCK_LOCK(so); - } - if (sb->sb_flags & SB_AIO) { - SOCK_UNLOCK(so); + if (sb->sb_flags & SB_AIO) aio_swake(so, sb); - } else - SOCK_UNLOCK(so); KNOTE(&sb->sb_sel.si_note, 0); - SOCK_LOCK(so); } /* @@ -966,11 +959,9 @@ sotoxsocket(struct socket *so, struct xsocket *xso) xso->xso_len = sizeof *xso; xso->xso_so = so; xso->so_type = so->so_type; - SOCK_LOCK(so); xso->so_options = so->so_options; xso->so_linger = so->so_linger; xso->so_state = so->so_state; - SOCK_UNLOCK(so); xso->so_pcb = so->so_pcb; xso->xso_protocol = so->so_proto->pr_protocol; xso->xso_family = so->so_proto->pr_domain->dom_family; diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index d434d3427e6e..6458ce08779c 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -82,7 +82,6 @@ static struct filterops sowrite_filtops = uma_zone_t socket_zone; so_gen_t so_gencnt; /* generation count for sockets */ -struct mtx socq_lock; MALLOC_DEFINE(M_SONAME, "soname", "socket name"); MALLOC_DEFINE(M_PCB, "pcb", "protocol control block"); @@ -129,8 +128,7 @@ soalloc(waitok) if (so) { /* XXX race condition for reentrant kernel */ so->so_gencnt = ++so_gencnt; - mtx_init(&so->so_rcv.sb_mtx, "sockbuf rcv", NULL, MTX_DEF); - mtx_init(&so->so_snd.sb_mtx, "sockbuf snd", NULL, MTX_DEF); + /* sx_init(&so->so_sxlock, "socket sxlock"); */ TAILQ_INIT(&so->so_aiojobq); ++numopensockets; } @@ -175,17 +173,14 @@ socreate(dom, aso, type, proto, cred, td) if (so == NULL) return (ENOBUFS); - SOCK_LOCK(so); TAILQ_INIT(&so->so_incomp); TAILQ_INIT(&so->so_comp); so->so_type = type; so->so_cred = crhold(cred); so->so_proto = prp; soref(so); - SOCK_UNLOCK(so); error = (*prp->pr_usrreqs->pru_attach)(so, proto, td); if (error) { - SOCK_LOCK(so); so->so_state |= SS_NOFDREF; sorele(so); return (error); @@ -212,9 +207,7 @@ static void sodealloc(struct socket *so) { - SOCK_LOCK(so); KASSERT(so->so_count == 0, ("sodealloc(): so_count %d", so->so_count)); - SOCK_UNLOCK(so); so->so_gencnt = ++so_gencnt; if (so->so_rcv.sb_hiwat) (void)chgsbsize(so->so_cred->cr_uidinfo, @@ -234,8 +227,7 @@ sodealloc(struct socket *so) } #endif crfree(so->so_cred); - mtx_destroy(&so->so_rcv.sb_mtx); - mtx_destroy(&so->so_snd.sb_mtx); + /* sx_destroy(&so->so_sxlock); */ uma_zfree(socket_zone, so); --numopensockets; } @@ -254,11 +246,8 @@ solisten(so, backlog, td) splx(s); return (error); } - if (TAILQ_EMPTY(&so->so_comp)) { - SOCK_LOCK(so); + if (TAILQ_EMPTY(&so->so_comp)) so->so_options |= SO_ACCEPTCONN; - SOCK_UNLOCK(so); - } if (backlog < 0 || backlog > somaxconn) backlog = somaxconn; so->so_qlimit = backlog; @@ -272,21 +261,15 @@ sofree(so) { struct socket *head = so->so_head; - SOCK_ASSERT(so, MA_OWNED); - KASSERT(so->so_count == 0, ("socket %p so_count not 0", so)); - if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) { - SOCK_UNLOCK(so); + if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) return; - } if (head != NULL) { if (so->so_state & SS_INCOMP) { - SOCK_UNLOCK(so); TAILQ_REMOVE(&head->so_incomp, so, so_list); head->so_incqlen--; } else if (so->so_state & SS_COMP) { - SOCK_UNLOCK(so); /* * We must not decommission a socket that's * on the accept(2) queue. If we do, then @@ -295,15 +278,11 @@ sofree(so) */ return; } else { - SOCK_UNLOCK(so); panic("sofree: not queued"); } - SOCK_LOCK(so); so->so_state &= ~SS_INCOMP; - SOCK_UNLOCK(so); so->so_head = NULL; - } else - SOCK_UNLOCK(so); + } sbrelease(&so->so_snd, so); sorflush(so); sodealloc(so); @@ -326,11 +305,9 @@ soclose(so) int error = 0; funsetown(&so->so_sigio); - SOCK_LOCK(so); if (so->so_options & SO_ACCEPTCONN) { struct socket *sp, *sonext; - SOCK_UNLOCK(so); sp = TAILQ_FIRST(&so->so_incomp); for (; sp != NULL; sp = sonext) { sonext = TAILQ_NEXT(sp, so_list); @@ -341,49 +318,38 @@ soclose(so) /* Dequeue from so_comp since sofree() won't do it */ TAILQ_REMOVE(&so->so_comp, sp, so_list); so->so_qlen--; - SOCK_LOCK(sp); sp->so_state &= ~SS_COMP; - SOCK_UNLOCK(sp); sp->so_head = NULL; (void) soabort(sp); } - SOCK_LOCK(so); } if (so->so_pcb == 0) goto discard; if (so->so_state & SS_ISCONNECTED) { if ((so->so_state & SS_ISDISCONNECTING) == 0) { error = sodisconnect(so); - if (error) { - SOCK_UNLOCK(so); + if (error) goto drop; - } } if (so->so_options & SO_LINGER) { if ((so->so_state & SS_ISDISCONNECTING) && - (so->so_state & SS_NBIO)) { - SOCK_UNLOCK(so); + (so->so_state & SS_NBIO)) goto drop; - } while (so->so_state & SS_ISCONNECTED) { - error = msleep((caddr_t)&so->so_timeo, SOCK_MTX(so), + error = tsleep((caddr_t)&so->so_timeo, PSOCK | PCATCH, "soclos", so->so_linger * hz); if (error) break; } } } - SOCK_UNLOCK(so); drop: - SOCK_ASSERT(so, MA_NOTOWNED); if (so->so_pcb) { int error2 = (*so->so_proto->pr_usrreqs->pru_detach)(so); if (error == 0) error = error2; } - SOCK_LOCK(so); discard: - SOCK_ASSERT(so, MA_OWNED); if (so->so_state & SS_NOFDREF) panic("soclose: NOFDREF"); so->so_state |= SS_NOFDREF; @@ -403,7 +369,6 @@ soabort(so) error = (*so->so_proto->pr_usrreqs->pru_abort)(so); if (error) { - SOCK_LOCK(so); sotryfree(so); /* note: does not decrement the ref count */ return error; } @@ -418,11 +383,9 @@ soaccept(so, nam) int s = splnet(); int error; - SOCK_LOCK(so); if ((so->so_state & SS_NOFDREF) == 0) panic("soaccept: !NOFDREF"); so->so_state &= ~SS_NOFDREF; - SOCK_UNLOCK(so); error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); splx(s); return (error); @@ -437,11 +400,8 @@ soconnect(so, nam, td) int s; int error; - SOCK_LOCK(so); - if (so->so_options & SO_ACCEPTCONN) { - SOCK_UNLOCK(so); + if (so->so_options & SO_ACCEPTCONN) return (EOPNOTSUPP); - } s = splnet(); /* * If protocol is connection-based, can only connect once. @@ -449,23 +409,12 @@ soconnect(so, nam, td) * This allows user to disconnect by connecting to, e.g., * a null address. */ - if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) { - if (so->so_proto->pr_flags & PR_CONNREQUIRED) { - SOCK_UNLOCK(so); - error = EISCONN; - goto done; - } else { - error = sodisconnect(so); - if (error) { - SOCK_UNLOCK(so); - error = EISCONN; - goto done; - } - } - } - SOCK_UNLOCK(so); - error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam, td); -done: + if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && + ((so->so_proto->pr_flags & PR_CONNREQUIRED) || + (error = sodisconnect(so)))) + error = EISCONN; + else + error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam, td); splx(s); return (error); } @@ -490,7 +439,6 @@ sodisconnect(so) int s = splnet(); int error; - SOCK_ASSERT(so, MA_OWNED); if ((so->so_state & SS_ISCONNECTED) == 0) { error = ENOTCONN; goto bad; @@ -499,9 +447,7 @@ sodisconnect(so) error = EALREADY; goto bad; } - SOCK_UNLOCK(so); error = (*so->so_proto->pr_usrreqs->pru_disconnect)(so); - SOCK_LOCK(so); bad: splx(s); return (error); @@ -560,22 +506,14 @@ sosend(so, addr, uio, top, control, flags, td) goto out; } - SOCK_LOCK(so); dontroute = (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && (so->so_proto->pr_flags & PR_ATOMIC); - SOCK_UNLOCK(so); if (td) td->td_proc->p_stats->p_ru.ru_msgsnd++; if (control) clen = control->m_len; -#define snderr(errno) \ - do { \ - error = errno; \ - SOCK_UNLOCK(so); \ - splx(s); \ - goto release; \ - } while(0); +#define snderr(errno) { error = errno; splx(s); goto release; } restart: error = sblock(&so->so_snd, SBLOCKWAIT(flags)); @@ -583,13 +521,11 @@ restart: goto out; do { s = splnet(); - SOCK_LOCK(so); if (so->so_state & SS_CANTSENDMORE) snderr(EPIPE); if (so->so_error) { error = so->so_error; so->so_error = 0; - SOCK_UNLOCK(so); splx(s); goto release; } @@ -609,21 +545,16 @@ restart: snderr(so->so_proto->pr_flags & PR_CONNREQUIRED ? ENOTCONN : EDESTADDRREQ); } - SOCK_UNLOCK(so); space = sbspace(&so->so_snd); if (flags & MSG_OOB) space += 1024; if ((atomic && resid > so->so_snd.sb_hiwat) || - clen > so->so_snd.sb_hiwat) { - SOCK_LOCK(so); + clen > so->so_snd.sb_hiwat) snderr(EMSGSIZE); - } if (space < resid + clen && (atomic || space < so->so_snd.sb_lowat || space < clen)) { - SOCK_LOCK(so); if (so->so_state & SS_NBIO) snderr(EWOULDBLOCK); - SOCK_UNLOCK(so); sbunlock(&so->so_snd); error = sbwait(&so->so_snd); splx(s); @@ -691,11 +622,8 @@ nopages: break; } } while (space > 0 && atomic); - if (dontroute) { - SOCK_LOCK(so); + if (dontroute) so->so_options |= SO_DONTROUTE; - SOCK_UNLOCK(so); - } s = splnet(); /* XXX */ /* * XXX all the SS_CANTSENDMORE checks previously @@ -721,11 +649,8 @@ nopages: (resid > 0 && space > 0) ? PRUS_MORETOCOME : 0, top, addr, control, td); splx(s); - if (dontroute) { - SOCK_LOCK(so); + if (dontroute) so->so_options &= ~SO_DONTROUTE; - SOCK_UNLOCK(so); - } clen = 0; control = 0; top = 0; @@ -805,15 +730,10 @@ bad: } if (mp) *mp = (struct mbuf *)0; - SOCK_LOCK(so); - if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) { - SOCK_UNLOCK(so); + if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) (*pr->pr_usrreqs->pru_rcvd)(so, 0); - } else - SOCK_UNLOCK(so); restart: - SOCK_ASSERT(so, MA_NOTOWNED); error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); if (error) return (error); @@ -847,37 +767,28 @@ restart: so->so_error = 0; goto release; } - SOCK_LOCK(so); if (so->so_state & SS_CANTRCVMORE) { - SOCK_UNLOCK(so); if (m) goto dontblock; else goto release; } - SOCK_UNLOCK(so); for (; m; m = m->m_next) if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { m = so->so_rcv.sb_mb; goto dontblock; } - SOCK_LOCK(so); if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - SOCK_UNLOCK(so); error = ENOTCONN; goto release; } - if (uio->uio_resid == 0) { - SOCK_UNLOCK(so); + if (uio->uio_resid == 0) goto release; - } if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { - SOCK_UNLOCK(so); error = EWOULDBLOCK; goto release; } - SOCK_UNLOCK(so); sbunlock(&so->so_rcv); error = sbwait(&so->so_rcv); splx(s); @@ -947,9 +858,7 @@ dontblock: else KASSERT(m->m_type == MT_DATA || m->m_type == MT_HEADER, ("m->m_type == %d", m->m_type)); - SOCK_LOCK(so); so->so_state &= ~SS_RCVATMARK; - SOCK_UNLOCK(so); len = uio->uio_resid; if (so->so_oobmark && len > so->so_oobmark - offset) len = so->so_oobmark - offset; @@ -1007,9 +916,7 @@ dontblock: if ((flags & MSG_PEEK) == 0) { so->so_oobmark -= len; if (so->so_oobmark == 0) { - SOCK_LOCK(so); so->so_state |= SS_RCVATMARK; - SOCK_UNLOCK(so); break; } } else { @@ -1029,12 +936,8 @@ dontblock: */ while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && !sosendallatonce(so) && !nextrecord) { - SOCK_LOCK(so); - if (so->so_error || so->so_state & SS_CANTRCVMORE) { - SOCK_UNLOCK(so); + if (so->so_error || so->so_state & SS_CANTRCVMORE) break; - } - SOCK_UNLOCK(so); /* * Notify the protocol that some data has been * drained before blocking. @@ -1064,15 +967,12 @@ dontblock: if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) (*pr->pr_usrreqs->pru_rcvd)(so, flags); } - SOCK_LOCK(so); if (orig_resid == uio->uio_resid && orig_resid && (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { - SOCK_UNLOCK(so); sbunlock(&so->so_rcv); splx(s); goto restart; } - SOCK_UNLOCK(so); if (flagsp) *flagsp |= flags; @@ -1114,10 +1014,7 @@ sorflush(so) socantrcvmore(so); sbunlock(sb); asb = *sb; -#define RANGEOF(type, start, end) (offsetof(type, end) - offsetof(type, start)) - bzero((caddr_t)&sb->sb_startzero, - (unsigned) RANGEOF(struct sockbuf, sb_startzero, sb_endzero)); -#undef RANGEOF + bzero((caddr_t)sb, sizeof (*sb)); splx(s); if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) (*pr->pr_domain->dom_dispose)(asb.sb_mb); @@ -1136,13 +1033,10 @@ do_setopt_accept_filter(so, sopt) int error = 0; /* do not set/remove accept filters on non listen sockets */ - SOCK_LOCK(so); if ((so->so_options & SO_ACCEPTCONN) == 0) { - SOCK_UNLOCK(so); error = EINVAL; goto out; } - SOCK_UNLOCK(so); /* removing the filter */ if (sopt == NULL) { @@ -1157,9 +1051,7 @@ do_setopt_accept_filter(so, sopt) FREE(af, M_ACCF); so->so_accf = NULL; } - SOCK_LOCK(so); so->so_options &= ~SO_ACCEPTFILTER; - SOCK_UNLOCK(so); return (0); } /* adding a filter */ @@ -1199,9 +1091,7 @@ do_setopt_accept_filter(so, sopt) } af->so_accept_filter = afp; so->so_accf = af; - SOCK_LOCK(so); so->so_options |= SO_ACCEPTFILTER; - SOCK_UNLOCK(so); out: if (afap != NULL) FREE(afap, M_TEMP); @@ -1273,13 +1163,11 @@ sosetopt(so, sopt) if (error) goto bad; - SOCK_LOCK(so); so->so_linger = l.l_linger; if (l.l_onoff) so->so_options |= SO_LINGER; else so->so_options &= ~SO_LINGER; - SOCK_UNLOCK(so); break; case SO_DEBUG: @@ -1295,12 +1183,10 @@ sosetopt(so, sopt) sizeof optval); if (error) goto bad; - SOCK_LOCK(so); if (optval) so->so_options |= sopt->sopt_name; else so->so_options &= ~sopt->sopt_name; - SOCK_UNLOCK(so); break; case SO_SNDBUF: @@ -1447,30 +1333,23 @@ sogetopt(so, sopt) switch (sopt->sopt_name) { #ifdef INET case SO_ACCEPTFILTER: + if ((so->so_options & SO_ACCEPTCONN) == 0) + return (EINVAL); MALLOC(afap, struct accept_filter_arg *, sizeof(*afap), M_TEMP, M_WAITOK | M_ZERO); - SOCK_LOCK(so); - if ((so->so_options & SO_ACCEPTCONN) == 0) { - SOCK_UNLOCK(so); - FREE(afap, M_TEMP); - return (EINVAL); - } if ((so->so_options & SO_ACCEPTFILTER) != 0) { strcpy(afap->af_name, so->so_accf->so_accept_filter->accf_name); if (so->so_accf->so_accept_filter_str != NULL) strcpy(afap->af_arg, so->so_accf->so_accept_filter_str); } - SOCK_UNLOCK(so); error = sooptcopyout(sopt, afap, sizeof(*afap)); FREE(afap, M_TEMP); break; #endif case SO_LINGER: - SOCK_LOCK(so); l.l_onoff = so->so_options & SO_LINGER; l.l_linger = so->so_linger; - SOCK_UNLOCK(so); error = sooptcopyout(sopt, &l, sizeof l); break; @@ -1483,9 +1362,7 @@ sogetopt(so, sopt) case SO_BROADCAST: case SO_OOBINLINE: case SO_TIMESTAMP: - SOCK_LOCK(so); optval = so->so_options & sopt->sopt_name; - SOCK_UNLOCK(so); integer: error = sooptcopyout(sopt, &optval, sizeof optval); break; @@ -1659,31 +1536,22 @@ sopoll(struct socket *so, int events, struct ucred *cred, struct thread *td) int revents = 0; int s = splnet(); - if (events & (POLLIN | POLLRDNORM)) { - SOCK_LOCK(so); + if (events & (POLLIN | POLLRDNORM)) if (soreadable(so)) revents |= events & (POLLIN | POLLRDNORM); - SOCK_UNLOCK(so); - } if (events & POLLINIGNEOF) if (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat || !TAILQ_EMPTY(&so->so_comp) || so->so_error) revents |= POLLINIGNEOF; - if (events & (POLLOUT | POLLWRNORM)) { - SOCK_LOCK(so); + if (events & (POLLOUT | POLLWRNORM)) if (sowriteable(so)) revents |= events & (POLLOUT | POLLWRNORM); - SOCK_UNLOCK(so); - } - if (events & (POLLPRI | POLLRDBAND)) { - SOCK_LOCK(so); + if (events & (POLLPRI | POLLRDBAND)) if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) revents |= events & (POLLPRI | POLLRDBAND); - SOCK_UNLOCK(so); - } if (revents == 0) { if (events & @@ -1712,12 +1580,10 @@ sokqfilter(struct file *fp, struct knote *kn) switch (kn->kn_filter) { case EVFILT_READ: - SOCK_LOCK(so); if (so->so_options & SO_ACCEPTCONN) kn->kn_fop = &solisten_filtops; else kn->kn_fop = &soread_filtops; - SOCK_UNLOCK(so); sb = &so->so_rcv; break; case EVFILT_WRITE: @@ -1754,18 +1620,13 @@ filt_soread(struct knote *kn, long hint) struct socket *so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = so->so_rcv.sb_cc; - SOCK_LOCK(so); if (so->so_state & SS_CANTRCVMORE) { - SOCK_UNLOCK(so); kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } - if (so->so_error) { /* temporary udp error */ - SOCK_UNLOCK(so); + if (so->so_error) /* temporary udp error */ return (1); - } - SOCK_UNLOCK(so); if (kn->kn_sfflags & NOTE_LOWAT) return (kn->kn_data >= kn->kn_sdata); return (kn->kn_data >= so->so_rcv.sb_lowat); @@ -1790,23 +1651,16 @@ filt_sowrite(struct knote *kn, long hint) struct socket *so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = sbspace(&so->so_snd); - SOCK_LOCK(so); if (so->so_state & SS_CANTSENDMORE) { - SOCK_UNLOCK(so); kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } - if (so->so_error) { /* temporary udp error */ - SOCK_UNLOCK(so); + if (so->so_error) /* temporary udp error */ return (1); - } if (((so->so_state & SS_ISCONNECTED) == 0) && - (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - SOCK_UNLOCK(so); + (so->so_proto->pr_flags & PR_CONNREQUIRED)) return (0); - } - SOCK_UNLOCK(so); if (kn->kn_sfflags & NOTE_LOWAT) return (kn->kn_data >= kn->kn_sdata); return (kn->kn_data >= so->so_snd.sb_lowat); diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 2a7c3433ab89..c8daa0903d09 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -102,56 +102,71 @@ soisconnecting(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= SS_ISCONNECTING; } void -soisconnected(so) +soisconnected_locked(so) struct socket *so; { - struct socket *head; - so_upcall_t *upcp; - void *upcarg; + struct socket *head = so->so_head; - SOCK_ASSERT(so, MA_OWNED); - head = so->so_head; so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); so->so_state |= SS_ISCONNECTED; if (head && (so->so_state & SS_INCOMP)) { if ((so->so_options & SO_ACCEPTFILTER) != 0) { - SOCK_UNLOCK(so); - SOCK_LOCK(head); - upcp = head->so_accf->so_accept_filter->accf_callback; - upcarg = head->so_accf->so_accept_filter_arg; - SOCK_UNLOCK(head); - SOCK_LOCK(so); - so->so_upcall = upcp; - so->so_upcallarg = upcarg; + so->so_upcall = head->so_accf->so_accept_filter->accf_callback; + so->so_upcallarg = head->so_accf->so_accept_filter_arg; so->so_rcv.sb_flags |= SB_UPCALL; so->so_options &= ~SO_ACCEPTFILTER; - SOCK_UNLOCK(so); - so->so_upcall(so, upcarg, 0); - SOCK_LOCK(so); + so->so_upcall(so, so->so_upcallarg, 0); return; } + TAILQ_REMOVE(&head->so_incomp, so, so_list); + head->so_incqlen--; so->so_state &= ~SS_INCOMP; + TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); + head->so_qlen++; so->so_state |= SS_COMP; - SOCK_UNLOCK(so); - SOCK_LOCK(head); + sorwakeup_locked(head); + wakeup_one(&head->so_timeo); + } else { + wakeup(&so->so_timeo); + sorwakeup_locked(so); + sowwakeup_locked(so); + } +} + +void +soisconnected(so) + struct socket *so; +{ + struct socket *head = so->so_head; + + so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); + so->so_state |= SS_ISCONNECTED; + if (head && (so->so_state & SS_INCOMP)) { + if ((so->so_options & SO_ACCEPTFILTER) != 0) { + so->so_upcall = head->so_accf->so_accept_filter->accf_callback; + so->so_upcallarg = head->so_accf->so_accept_filter_arg; + so->so_rcv.sb_flags |= SB_UPCALL; + so->so_options &= ~SO_ACCEPTFILTER; + so->so_upcall(so, so->so_upcallarg, 0); + return; + } TAILQ_REMOVE(&head->so_incomp, so, so_list); head->so_incqlen--; + so->so_state &= ~SS_INCOMP; TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); head->so_qlen++; - sorwakeup(head); + so->so_state |= SS_COMP; + sorwakeup_locked(head); wakeup_one(&head->so_timeo); - SOCK_UNLOCK(head); - SOCK_LOCK(so); } else { wakeup(&so->so_timeo); - sorwakeup(so); - sowwakeup(so); + sorwakeup_locked(so); + sowwakeup_locked(so); } } @@ -160,25 +175,31 @@ soisdisconnecting(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~SS_ISCONNECTING; so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); + sowwakeup_locked(so); + sorwakeup_locked(so); } void -soisdisconnected(so) +soisdisconnected_locked(so) register struct socket *so; { - SOCK_ASSERT(so, MA_OWNED); so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE|SS_ISDISCONNECTED); wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); + sowwakeup_locked(so); + sorwakeup_locked(so); +} + +void +soisdisconnected(so) + register struct socket *so; +{ + + soisdisconnected_locked(so); } /* @@ -203,32 +224,25 @@ sonewconn(head, connstatus) so = soalloc(0); if (so == NULL) return ((struct socket *)0); - SOCK_LOCK(head); if ((head->so_options & SO_ACCEPTFILTER) != 0) connstatus = 0; - SOCK_UNLOCK(head); so->so_head = head; so->so_type = head->so_type; - SOCK_LOCK(so); so->so_options = head->so_options &~ SO_ACCEPTCONN; so->so_linger = head->so_linger; so->so_state = head->so_state | SS_NOFDREF; - SOCK_UNLOCK(so); so->so_proto = head->so_proto; so->so_timeo = head->so_timeo; so->so_cred = crhold(head->so_cred); if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat) || (*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) { - SOCK_LOCK(so); sotryfree(so); return ((struct socket *)0); } if (connstatus) { TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); - SOCK_LOCK(so); so->so_state |= SS_COMP; - SOCK_UNLOCK(so); head->so_qlen++; } else { if (head->so_incqlen > head->so_qlimit) { @@ -237,19 +251,13 @@ sonewconn(head, connstatus) (void) soabort(sp); } TAILQ_INSERT_TAIL(&head->so_incomp, so, so_list); - SOCK_LOCK(so); so->so_state |= SS_INCOMP; - SOCK_UNLOCK(so); head->so_incqlen++; } if (connstatus) { - SOCK_LOCK(head); - sorwakeup(head); + sorwakeup_locked(head); wakeup((caddr_t)&head->so_timeo); - SOCK_UNLOCK(head); - SOCK_LOCK(so); so->so_state |= connstatus; - SOCK_UNLOCK(so); } return (so); } @@ -269,10 +277,8 @@ socantsendmore(so) struct socket *so; { - SOCK_LOCK(so); so->so_state |= SS_CANTSENDMORE; - sowwakeup(so); - SOCK_UNLOCK(so); + sowwakeup_locked(so); } void @@ -280,10 +286,8 @@ socantrcvmore(so) struct socket *so; { - SOCK_LOCK(so); so->so_state |= SS_CANTRCVMORE; - sorwakeup(so); - SOCK_UNLOCK(so); + sorwakeup_locked(so); } /* @@ -332,7 +336,6 @@ sowakeup(so, sb) register struct socket *so; register struct sockbuf *sb; { - SOCK_ASSERT(so, MA_OWNED); selwakeup(&sb->sb_sel); sb->sb_flags &= ~SB_SEL; @@ -340,23 +343,13 @@ sowakeup(so, sb) sb->sb_flags &= ~SB_WAIT; wakeup((caddr_t)&sb->sb_cc); } - if ((so->so_state & SS_ASYNC) && so->so_sigio != NULL) { - SOCK_UNLOCK(so); + if ((so->so_state & SS_ASYNC) && so->so_sigio != NULL) pgsigio(&so->so_sigio, SIGIO, 0); - SOCK_LOCK(so); - } - if (sb->sb_flags & SB_UPCALL) { - SOCK_UNLOCK(so); + if (sb->sb_flags & SB_UPCALL) (*so->so_upcall)(so, so->so_upcallarg, M_DONTWAIT); - SOCK_LOCK(so); - } - if (sb->sb_flags & SB_AIO) { - SOCK_UNLOCK(so); + if (sb->sb_flags & SB_AIO) aio_swake(so, sb); - } else - SOCK_UNLOCK(so); KNOTE(&sb->sb_sel.si_note, 0); - SOCK_LOCK(so); } /* @@ -966,11 +959,9 @@ sotoxsocket(struct socket *so, struct xsocket *xso) xso->xso_len = sizeof *xso; xso->xso_so = so; xso->so_type = so->so_type; - SOCK_LOCK(so); xso->so_options = so->so_options; xso->so_linger = so->so_linger; xso->so_state = so->so_state; - SOCK_UNLOCK(so); xso->so_pcb = so->so_pcb; xso->xso_protocol = so->so_proto->pr_protocol; xso->xso_family = so->so_proto->pr_domain->dom_family; diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 0c00fe510956..f80dcc9f9084 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -245,15 +245,12 @@ accept1(td, uap, compat) if (error) goto done2; s = splnet(); - SOCK_LOCK(head); if ((head->so_options & SO_ACCEPTCONN) == 0) { - SOCK_UNLOCK(head); splx(s); error = EINVAL; goto done; } if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) { - SOCK_UNLOCK(head); splx(s); error = EWOULDBLOCK; goto done; @@ -263,16 +260,13 @@ accept1(td, uap, compat) head->so_error = ECONNABORTED; break; } - error = msleep((caddr_t)&head->so_timeo, - SOCK_MTX(head), PSOCK | PCATCH, + error = tsleep((caddr_t)&head->so_timeo, PSOCK | PCATCH, "accept", 0); if (error) { - SOCK_UNLOCK(head); splx(s); goto done; } } - SOCK_UNLOCK(head); if (head->so_error) { error = head->so_error; head->so_error = 0; @@ -311,17 +305,13 @@ accept1(td, uap, compat) /* connection has been removed from the listen queue */ KNOTE(&head->so_rcv.sb_sel.si_note, 0); - SOCK_LOCK(so); so->so_state &= ~SS_COMP; - SOCK_UNLOCK(so); so->so_head = NULL; if (head->so_sigio != NULL) fsetown(fgetown(head->so_sigio), &so->so_sigio); FILE_LOCK(nfp); - SOCK_LOCK(so); soref(so); /* file descriptor reference */ - SOCK_UNLOCK(so); nfp->f_data = (caddr_t)so; /* nfp has ref count from falloc */ nfp->f_flag = fflag; nfp->f_ops = &socketops; @@ -442,30 +432,24 @@ connect(td, uap) mtx_lock(&Giant); if ((error = fgetsock(td, uap->s, &so, NULL)) != 0) goto done2; - SOCK_LOCK(so); if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { - SOCK_UNLOCK(so); error = EALREADY; goto done1; } - SOCK_UNLOCK(so); error = getsockaddr(&sa, uap->name, uap->namelen); if (error) goto done1; error = soconnect(so, sa, td); if (error) goto bad; - SOCK_LOCK(so); if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { - SOCK_UNLOCK(so); FREE(sa, M_SONAME); error = EINPROGRESS; goto done1; } s = splnet(); while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) { - error = msleep((caddr_t)&so->so_timeo, - SOCK_MTX(so), PSOCK | PCATCH, "connec", 0); + error = tsleep((caddr_t)&so->so_timeo, PSOCK | PCATCH, "connec", 0); if (error) break; } @@ -473,12 +457,9 @@ connect(td, uap) error = so->so_error; so->so_error = 0; } - SOCK_UNLOCK(so); splx(s); bad: - SOCK_LOCK(so); so->so_state &= ~SS_ISCONNECTING; - SOCK_UNLOCK(so); FREE(sa, M_SONAME); if (error == ERESTART) error = EINTR; @@ -1431,13 +1412,10 @@ getpeername1(td, uap, compat) mtx_lock(&Giant); if ((error = fgetsock(td, uap->fdes, &so, NULL)) != 0) goto done2; - SOCK_LOCK(so); if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) { - SOCK_UNLOCK(so); error = ENOTCONN; goto done1; } - SOCK_UNLOCK(so); error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)); if (error) goto done1; @@ -1695,13 +1673,10 @@ sendfile(struct thread *td, struct sendfile_args *uap) error = EINVAL; goto done; } - SOCK_LOCK(so); if ((so->so_state & SS_ISCONNECTED) == 0) { - SOCK_UNLOCK(so); error = ENOTCONN; goto done; } - SOCK_UNLOCK(so); if (uap->offset < 0) { error = EINVAL; goto done; @@ -1764,17 +1739,14 @@ retry_lookup: * Optimize the non-blocking case by looking at the socket space * before going to the extra work of constituting the sf_buf. */ - SOCK_LOCK(so); if ((so->so_state & SS_NBIO) && sbspace(&so->so_snd) <= 0) { if (so->so_state & SS_CANTSENDMORE) error = EPIPE; else error = EAGAIN; - SOCK_UNLOCK(so); sbunlock(&so->so_snd); goto done; } - SOCK_UNLOCK(so); /* * Attempt to look up the page. * @@ -1897,7 +1869,6 @@ retry_space: * blocks before the pru_send (or more accurately, any blocking * results in a loop back to here to re-check). */ - SOCK_LOCK(so); if ((so->so_state & SS_CANTSENDMORE) || so->so_error) { if (so->so_state & SS_CANTSENDMORE) { error = EPIPE; @@ -1905,7 +1876,6 @@ retry_space: error = so->so_error; so->so_error = 0; } - SOCK_UNLOCK(so); m_freem(m); sbunlock(&so->so_snd); splx(s); @@ -1918,14 +1888,12 @@ retry_space: */ if (sbspace(&so->so_snd) < so->so_snd.sb_lowat) { if (so->so_state & SS_NBIO) { - SOCK_UNLOCK(so); m_freem(m); sbunlock(&so->so_snd); splx(s); error = EAGAIN; goto done; } - SOCK_UNLOCK(so); error = sbwait(&so->so_snd); /* * An error from sbwait usually indicates that we've @@ -1940,7 +1908,6 @@ retry_space: } goto retry_space; } - SOCK_UNLOCK(so); error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, m, 0, 0, td); splx(s); if (error) { diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 55e7c45c8121..04d670c1fb0d 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -104,7 +104,6 @@ uipc_abort(struct socket *so) return EINVAL; unp_drop(unp, ECONNABORTED); unp_detach(unp); - SOCK_LOCK(so); sotryfree(so); return 0; } @@ -250,9 +249,7 @@ uipc_rcvd(struct socket *so, int flags) (void)chgsbsize(so2->so_cred->cr_uidinfo, &so2->so_snd.sb_hiwat, newhiwat, RLIM_INFINITY); unp->unp_cc = so->so_rcv.sb_cc; - SOCK_LOCK(so2); sowwakeup(so2); - SOCK_UNLOCK(so2); break; default: @@ -309,9 +306,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, else from = &sun_noname; if (sbappendaddr(&so2->so_rcv, from, m, control)) { - SOCK_LOCK(so2); sorwakeup(so2); - SOCK_UNLOCK(so2); m = 0; control = 0; } else @@ -327,9 +322,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, * Note: A better implementation would complain * if not equal to the peer's address. */ - SOCK_LOCK(so); if ((so->so_state & SS_ISCONNECTED) == 0) { - SOCK_UNLOCK(so); if (nam) { error = unp_connect(so, nam, td); if (error) @@ -341,11 +334,9 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, } if (so->so_state & SS_CANTSENDMORE) { - SOCK_UNLOCK(so); error = EPIPE; break; } - SOCK_UNLOCK(so); if (unp->unp_conn == 0) panic("uipc_send connected but no connection?"); so2 = unp->unp_conn->unp_socket; @@ -367,9 +358,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, (void)chgsbsize(so->so_cred->cr_uidinfo, &so->so_snd.sb_hiwat, newhiwat, RLIM_INFINITY); unp->unp_conn->unp_cc = so2->so_rcv.sb_cc; - SOCK_LOCK(so2); sorwakeup(so2); - SOCK_UNLOCK(so2); m = 0; break; @@ -574,9 +563,7 @@ unp_detach(unp) unp_disconnect(unp); while (!LIST_EMPTY(&unp->unp_refs)) unp_drop(LIST_FIRST(&unp->unp_refs), ECONNRESET); - SOCK_LOCK(unp->unp_socket); soisdisconnected(unp->unp_socket); - SOCK_UNLOCK(unp->unp_socket); unp->unp_socket->so_pcb = 0; if (unp_rights) { /* @@ -710,14 +697,8 @@ unp_connect(so, nam, td) goto bad; } if (so->so_proto->pr_flags & PR_CONNREQUIRED) { - SOCK_LOCK(so2); - if ((so2->so_options & SO_ACCEPTCONN) == 0) { - SOCK_UNLOCK(so2); - error = ECONNREFUSED; - goto bad; - } - SOCK_UNLOCK(so2); - if ((so3 = sonewconn(so2, 0)) == 0) { + if ((so2->so_options & SO_ACCEPTCONN) == 0 || + (so3 = sonewconn(so2, 0)) == 0) { error = ECONNREFUSED; goto bad; } @@ -775,19 +756,13 @@ unp_connect2(so, so2) case SOCK_DGRAM: LIST_INSERT_HEAD(&unp2->unp_refs, unp, unp_reflink); - SOCK_LOCK(so); soisconnected(so); - SOCK_UNLOCK(so); break; case SOCK_STREAM: unp2->unp_conn = unp; - SOCK_LOCK(so); soisconnected(so); - SOCK_UNLOCK(so); - SOCK_LOCK(so2); soisconnected(so2); - SOCK_UNLOCK(so2); break; default: @@ -809,19 +784,13 @@ unp_disconnect(unp) case SOCK_DGRAM: LIST_REMOVE(unp, unp_reflink); - SOCK_LOCK(unp->unp_socket); unp->unp_socket->so_state &= ~SS_ISCONNECTED; - SOCK_UNLOCK(unp->unp_socket); break; case SOCK_STREAM: - SOCK_LOCK(unp->unp_socket); soisdisconnected(unp->unp_socket); - SOCK_UNLOCK(unp->unp_socket); - SOCK_LOCK(unp2->unp_socket); unp2->unp_conn = 0; soisdisconnected(unp2->unp_socket); - SOCK_UNLOCK(unp2->unp_socket); break; } } diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 71df5cef6cf2..891f27285e5d 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -1440,10 +1440,8 @@ no_kqueue: */ so = (struct socket *)fp->f_data; s = splnet(); - SOCK_LOCK(so); if (((opcode == LIO_READ) && (!soreadable(so))) || ((opcode == LIO_WRITE) && (!sowriteable(so)))) { - SOCK_UNLOCK(so); TAILQ_INSERT_TAIL(&so->so_aiojobq, aiocbe, list); TAILQ_INSERT_TAIL(&ki->kaio_sockqueue, aiocbe, plist); if (opcode == LIO_READ) @@ -1457,7 +1455,6 @@ no_kqueue: error = 0; goto done; } - SOCK_UNLOCK(so); splx(s); } |