svn commit: r301601 - projects/vnet/sys/netinet
Marko Zec
zec at fer.hr
Wed Jun 8 11:57:15 UTC 2016
On Wed, 8 Jun 2016 11:24:01 +0000
"Bjoern A. Zeeb" <bz at freebsd.org> wrote:
> 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].
This is a welcome improvement! However, unconditionally pausing for
100 ms migt be an overpessimization here. Perhaps the pause could
be moved after reading V_tcbinfo.ipi_count, in order to pause
conditionally only on non-zero reads, which should almost never happen
in practice, as the DELAY() hack was already deemed a safety belt in
the first place. And even if / when the pause would be triggered, it
would be probably enough to sleep for 10 ms or so - the removed DELAY()
actually lasted for only a single clock tick.
Marko
> 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