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
This commit is contained in:
Bjoern A. Zeeb 2016-06-23 00:34:03 +00:00
parent 252a46f324
commit b54e08e11a

View File

@ -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();