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:
parent
252a46f324
commit
b54e08e11a
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user