svn commit: r184853 - in stable/7/sys: . modules/cxgb netinet

Robert Watson rwatson at FreeBSD.org
Tue Nov 11 09:12:27 PST 2008


Author: rwatson
Date: Tue Nov 11 17:12:26 2008
New Revision: 184853
URL: http://svn.freebsd.org/changeset/base/184853

Log:
  Merge r184304 from head to stable/7:
  
  In both dropwithreset paths in tcp_input.c, drop the tcbinfo lock
  sooner to decomplicate locking and eliminate the need for a rather
  chatty comment about why we have to handle the global lock in a
  special way for the benefit of ipfw and pf cred rules.
  
  Approved by:	re (kib)

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/modules/cxgb/   (props changed)
  stable/7/sys/netinet/tcp_input.c

Modified: stable/7/sys/netinet/tcp_input.c
==============================================================================
--- stable/7/sys/netinet/tcp_input.c	Tue Nov 11 17:10:24 2008	(r184852)
+++ stable/7/sys/netinet/tcp_input.c	Tue Nov 11 17:12:26 2008	(r184853)
@@ -849,19 +849,12 @@ findpcb:
 
 dropwithreset:
 	INP_INFO_WLOCK_ASSERT(&tcbinfo);
+	INP_INFO_WUNLOCK(&tcbinfo);
 
-	/*
-	 * If inp is non-NULL, we call tcp_dropwithreset() holding both inpcb
-	 * and global locks.  However, if NULL, we must hold neither as
-	 * firewalls may acquire the global lock in order to look for a
-	 * matching inpcb.
-	 */
 	if (inp != NULL) {
 		tcp_dropwithreset(m, th, tp, tlen, rstreason);
 		INP_WUNLOCK(inp);
-	}
-	INP_INFO_WUNLOCK(&tcbinfo);
-	if (inp == NULL)
+	} else
 		tcp_dropwithreset(m, th, NULL, tlen, rstreason);
 	m = NULL;	/* mbuf chain got consumed. */
 	goto drop;
@@ -2414,19 +2407,12 @@ dropafterack:
 
 dropwithreset:
 	KASSERT(headlocked, ("%s: dropwithreset: head not locked", __func__));
+	INP_INFO_WUNLOCK(&tcbinfo);
 
-	/*
-	 * If tp is non-NULL, we call tcp_dropwithreset() holding both inpcb
-	 * and global locks.  However, if NULL, we must hold neither as
-	 * firewalls may acquire the global lock in order to look for a
-	 * matching inpcb.
-	 */
 	if (tp != NULL) {
 		tcp_dropwithreset(m, th, tp, tlen, rstreason);
 		INP_WUNLOCK(tp->t_inpcb);
-	}
-	INP_INFO_WUNLOCK(&tcbinfo);
-	if (tp == NULL)
+	} else
 		tcp_dropwithreset(m, th, NULL, tlen, rstreason);
 	return;
 


More information about the svn-src-all mailing list