Author: bz
Date: Thu Jun 23 00:34:03 2016
New Revision: 302099
URL: https://svnweb.freebsd.org/changeset/base/302099

Log:
  Check the V_tcbinfo.ipi_count to hit 0 before doing the full TCP cleanup.
  That way timers can finish cleanly and we do not gamble with a DELAY().
  
  Reviewed by:          gnn, jtl
  Approved by:          re (gjb)
  Obtained from:                projects/vnet
  MFC after:            2 weeks
  Sponsored by:         The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D6923

Modified:
  head/sys/netinet/tcp_subr.c

Modified: head/sys/netinet/tcp_subr.c
==============================================================================
--- head/sys/netinet/tcp_subr.c Thu Jun 23 00:32:58 2016        (r302098)
+++ head/sys/netinet/tcp_subr.c Thu Jun 23 00:34:03 2016        (r302099)
@@ -731,18 +731,19 @@ tcp_init(void)
 static void
 tcp_destroy(void *unused __unused)
 {
-       int error;
+       int error, n;
 
        /*
         * All our processes are gone, all our sockets should be cleaned
         * up, which means, we should be past the tcp_discardcb() calls.
-        * Sleep to let all tcpcb timers really disappear and then cleanup.
-        * Timewait will cleanup its queue and will be ready to go.
-        * XXX-BZ In theory a few ticks should be good enough to make sure
-        * the timers are all really gone.  We should see if we could use a
-        * better metric here and, e.g., check a tcbcb count as an optimization?
+        * Sleep to let all tcpcb timers really disappear and cleanup.
         */
-       DELAY(1000000 / hz);
+       do {
+               pause("tcpdes", hz/10);
+               INP_LIST_RLOCK(&V_tcbinfo);
+               n = V_tcbinfo.ipi_count;
+               INP_LIST_RUNLOCK(&V_tcbinfo);
+       } while (n != 0);
        tcp_hc_destroy();
        syncache_destroy();
        tcp_tw_destroy();
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to