summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authortanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
committertanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
commite6fa9b9e922913444c2e6b2b58bf3de5eaed868d (patch)
tree9d5f24794525313566896ab89aa860515db344a6 /sys/kern
parent1ea6cbb8c29088e04528460633798a6c131ca1ba (diff)
downloadFreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.zip
FreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.tar.gz
Back out my lats commit of locking down a socket, it conflicts with hsu's work.
Requested by: hsu
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_descrip.c7
-rw-r--r--sys/kern/sys_socket.c8
-rw-r--r--sys/kern/uipc_domain.c8
-rw-r--r--sys/kern/uipc_sockbuf.c127
-rw-r--r--sys/kern/uipc_socket.c208
-rw-r--r--sys/kern/uipc_socket2.c127
-rw-r--r--sys/kern/uipc_syscalls.c37
-rw-r--r--sys/kern/uipc_usrreq.c35
-rw-r--r--sys/kern/vfs_aio.c3
9 files changed, 158 insertions, 402 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 8a6176d..15837d3 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 6c1a23c..c8a6198 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 cfb7768..b8321eb 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 2a7c343..c8daa09 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 d434d34..6458ce0 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 2a7c343..c8daa09 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 0c00fe5..f80dcc9 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 55e7c45..04d670c 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 71df5ce..891f272 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);
}
OpenPOWER on IntegriCloud