svn commit: r354485 - head/sys/netinet

Gleb Smirnoff glebius at FreeBSD.org
Thu Nov 7 21:28:47 UTC 2019


Author: glebius
Date: Thu Nov  7 21:28:46 2019
New Revision: 354485
URL: https://svnweb.freebsd.org/changeset/base/354485

Log:
  Since pfslowtimo() runs in the network epoch, tcp_slowtimo()
  also does.  This allows to simplify tcp_tw_2msl_scan() and
  always require the network epoch in it.

Modified:
  head/sys/netinet/tcp_timewait.c

Modified: head/sys/netinet/tcp_timewait.c
==============================================================================
--- head/sys/netinet/tcp_timewait.c	Thu Nov  7 21:27:32 2019	(r354484)
+++ head/sys/netinet/tcp_timewait.c	Thu Nov  7 21:28:46 2019	(r354485)
@@ -689,25 +689,8 @@ tcp_tw_2msl_scan(int reuse)
 {
 	struct tcptw *tw;
 	struct inpcb *inp;
-	struct epoch_tracker et;
 
-#ifdef INVARIANTS
-	if (reuse) {
-		/*
-		 * Exclusive pcbinfo lock is not required in reuse case even if
-		 * two inpcb locks can be acquired simultaneously:
-		 *  - the inpcb transitioning to TIME_WAIT state in
-		 *    tcp_tw_start(),
-		 *  - the inpcb closed by tcp_twclose().
-		 *
-		 * It is because only inpcbs in FIN_WAIT2 or CLOSING states can
-		 * transition in TIME_WAIT state.  Then a pcbcb cannot be in
-		 * TIME_WAIT list and transitioning to TIME_WAIT state at same
-		 * time.
-		 */
-		INP_INFO_RLOCK_ASSERT(&V_tcbinfo);
-	}
-#endif
+	NET_EPOCH_ASSERT();
 
 	for (;;) {
 		TW_RLOCK(V_tw_lock);
@@ -723,12 +706,10 @@ tcp_tw_2msl_scan(int reuse)
 		in_pcbref(inp);
 		TW_RUNLOCK(V_tw_lock);
 
-		INP_INFO_RLOCK_ET(&V_tcbinfo, et);
 		INP_WLOCK(inp);
 		tw = intotw(inp);
 		if (in_pcbrele_wlocked(inp)) {
 			if (__predict_true(tw == NULL)) {
-				INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
 				continue;
 			} else {
 				/* This should not happen as in TIMEWAIT
@@ -747,7 +728,6 @@ tcp_tw_2msl_scan(int reuse)
 					"|| inp last reference) && tw != "
 					"NULL", __func__);
 #endif
-				INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
 				break;
 			}
 		}
@@ -755,12 +735,10 @@ tcp_tw_2msl_scan(int reuse)
 		if (tw == NULL) {
 			/* tcp_twclose() has already been called */
 			INP_WUNLOCK(inp);
-			INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
 			continue;
 		}
 
 		tcp_twclose(tw, reuse);
-		INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
 		if (reuse)
 			return tw;
 	}


More information about the svn-src-all mailing list