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