PERFORCE change 54583 for review

Robert Watson rwatson at FreeBSD.org
Thu Jun 10 22:21:08 GMT 2004


http://perforce.freebsd.org/chv.cgi?CH=54583

Change 54583 by rwatson at rwatson_paprika on 2004/06/10 22:19:38

	Reinject netperf_socket socket locking following slightly too
	enthusiastic resolve -at of UNIX domain socket locking from
	CVS.

Affected files ...

.. //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#10 edit

Differences ...

==== //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#10 (text+ko) ====

@@ -114,6 +114,7 @@
 	UNP_LOCK();
 	unp_drop(unp, ECONNABORTED);
 	unp_detach(unp);	/* NB: unlocks */
+	SOCK_LOCK(so);
 	sotryfree(so);
 	return (0);
 }
@@ -269,6 +270,12 @@
 
 	if (unp == NULL)
 		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_LOCK();
 	switch (so->so_type) {
 	case SOCK_DGRAM:
@@ -276,9 +283,14 @@
 		/*NOTREACHED*/
 
 	case SOCK_STREAM:
-		if (unp->unp_conn == NULL)
+		if (unp->unp_conn == NULL) {
+			SOCKBUF_LOCK(&so->so_rcv);
 			break;
+		}
 		so2 = unp->unp_conn->unp_socket;
+		/* 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.
@@ -290,7 +302,8 @@
 		(void)chgsbsize(so2->so_cred->cr_uidinfo, &so2->so_snd.sb_hiwat,
 		    newhiwat, RLIM_INFINITY);
 		unp->unp_cc = so->so_rcv.sb_cc;
-		sowwakeup(so2);
+		sowwakeup_locked(so2);
+		SOCKBUF_UNLOCK(&so2->so_snd);
 		break;
 
 	default:
@@ -323,7 +336,13 @@
 	if (control != NULL && (error = unp_internalize(&control, td)))
 		goto release;
 
+	/*
+	 * Reorder locks to avoid LORs.
+	 */
+	SOCKBUF_UNLOCK(&so->so_snd);
 	UNP_LOCK();
+	SOCKBUF_LOCK(&so->so_snd);
+
 	switch (so->so_type) {
 	case SOCK_DGRAM:
 	{
@@ -334,7 +353,9 @@
 				error = EISCONN;
 				break;
 			}
+			SOCKBUF_UNLOCK(&so->so_snd);
 			error = unp_connect(so, nam, td);
+			SOCKBUF_LOCK(&so->so_snd);
 			if (error)
 				break;
 		} else {
@@ -348,13 +369,15 @@
 			from = (struct sockaddr *)unp->unp_addr;
 		else
 			from = &sun_noname;
-		if (sbappendaddr(&so2->so_rcv, from, m, control)) {
-			sorwakeup(so2);
+		SOCKBUF_LOCK(&so2->so_rcv);
+		if (sbappendaddr_locked(&so2->so_rcv, from, m, control)) {
+			sorwakeup_locked(so2);
 			m = NULL;
 			control = NULL;
 		} else {
 			error = ENOBUFS;
 		}
+		SOCKBUF_UNLOCK(&so2->so_rcv);
 		if (nam != NULL)
 			unp_disconnect(unp);
 		break;
@@ -368,7 +391,9 @@
 		 */
 		if ((so->so_state & SS_ISCONNECTED) == 0) {
 			if (nam != NULL) {
+				SOCKBUF_UNLOCK(&so->so_snd);
 				error = unp_connect(so, nam, td);
+				SOCKBUF_LOCK(&so->so_snd);
 				if (error)
 					break;	/* XXX */
 			} else {
@@ -384,16 +409,17 @@
 		if (unp->unp_conn == NULL)
 			panic("uipc_send connected but no connection?");
 		so2 = unp->unp_conn->unp_socket;
+		SOCKBUF_LOCK(&so2->so_rcv);
 		/*
 		 * Send to paired receive port, and then reduce
 		 * send buffer hiwater marks to maintain backpressure.
 		 * Wake up readers.
 		 */
 		if (control != NULL) {
-			if (sbappendcontrol(&so2->so_rcv, m, control))
+			if (sbappendcontrol_locked(&so2->so_rcv, m, control))
 				control = NULL;
 		} else {
-			sbappend(&so2->so_rcv, m);
+			sbappend_locked(&so2->so_rcv, m);
 		}
 		so->so_snd.sb_mbmax -=
 			so2->so_rcv.sb_mbcnt - unp->unp_conn->unp_mbcnt;
@@ -403,7 +429,8 @@
 		(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;
-		sorwakeup(so2);
+		sorwakeup_locked(so2);
+		SOCKBUF_UNLOCK(&so2->so_rcv);
 		m = NULL;
 		break;
 
@@ -416,7 +443,7 @@
 	 * a SHUTDOWN.
 	 */
 	if (flags & PRUS_EOF) {
-		socantsendmore(so);
+		socantsendmore_locked(so);
 		unp_shutdown(unp);
 	}
 	UNP_UNLOCK();
@@ -462,6 +489,7 @@
 	if (unp == NULL)
 		return (EINVAL);
 	UNP_LOCK();
+	/* XXX socket lock? */
 	socantsendmore(so);
 	unp_shutdown(unp);
 	UNP_UNLOCK();


More information about the p4-projects mailing list