PERFORCE change 43754 for review
Sam Leffler
sam at FreeBSD.org
Wed Dec 10 12:35:56 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=43754
Change 43754 by sam at sam_ebb on 2003/12/10 12:35:06
o correctly order so_rcv lock in pru_send+pru_rcvd
o corect lock/unlock typo
Affected files ...
.. //depot/projects/netperf+sockets/sys/kern/uipc_usrreq.c#4 edit
Differences ...
==== //depot/projects/netperf+sockets/sys/kern/uipc_usrreq.c#4 (text+ko) ====
@@ -300,6 +300,12 @@
if (unp == 0)
return EINVAL;
+ /*
+ * Reorder locks to avoid LORs. Note that we
+ * delay re-locking so_rcv to below so it can
+ * be done only once.
+ */
+ SOCKBUF_UNLOCK(&so->so_rcv);
UNP_ENTER(unp);
switch (so->so_type) {
case SOCK_DGRAM:
@@ -307,11 +313,14 @@
/*NOTREACHED*/
case SOCK_STREAM:
- if (unp->unp_conn == 0)
+ if (unp->unp_conn == 0) {
+ SOCKBUF_LOCK(&so->so_rcv);
break;
+ }
so2 = unp->unp_conn->unp_socket;
- /* XXX so_rcv lock */
+ /* NB: careful of order here */
SOCKBUF_LOCK(&so2->so_snd);
+ SOCKBUF_LOCK(&so->so_rcv);
/*
* Adjust backpressure on sender
* and wakeup any waiting to write.
@@ -413,7 +422,7 @@
if (nam) {
SOCKBUF_UNLOCK(&so->so_snd);
error = unp_connect(so, nam, td);
- SOCKBUF_UNLOCK(&so->so_snd);
+ SOCKBUF_LOCK(&so->so_snd);
if (error)
break; /* XXX */
} else {
More information about the p4-projects
mailing list