svn commit: r302099 - head/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Thu Jun 23 00:34:05 UTC 2016
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();
More information about the svn-src-head
mailing list