svn commit: r301601 - projects/vnet/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Wed Jun 8 11:24:02 UTC 2016
Author: bz
Date: Wed Jun 8 11:24:01 2016
New Revision: 301601
URL: https://svnweb.freebsd.org/changeset/base/301601
Log:
Replace the DELAY with a more sophisticated check to make sure
the inps are all gone before doing the cleanup. We might decide
to do a partial cleanup before polling, but for now bail on the
safe side.
Also use pause instead of DELAY [1].
Suggested by: rwatson [1]
Sponsored by: The FreeBSD Foundation
Modified:
projects/vnet/sys/netinet/tcp_subr.c
Modified: projects/vnet/sys/netinet/tcp_subr.c
==============================================================================
--- projects/vnet/sys/netinet/tcp_subr.c Wed Jun 8 11:18:49 2016 (r301600)
+++ projects/vnet/sys/netinet/tcp_subr.c Wed Jun 8 11:24:01 2016 (r301601)
@@ -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-projects
mailing list