• Kuniyuki Iwashima's avatar
    tcp: Save unnecessary inet_twsk_purge() calls. · edc12f03
    Kuniyuki Iwashima authored
    While destroying netns, we call inet_twsk_purge() in tcp_sk_exit_batch()
    and tcpv6_net_exit_batch() for AF_INET and AF_INET6.  These commands
    trigger the kernel to walk through the potentially big ehash twice even
    though the netns has no TIME_WAIT sockets.
    
      # ip netns add test
      # ip netns del test
    
      or
    
      # unshare -n /bin/true >/dev/null
    
    When tw_refcount is 1, we need not call inet_twsk_purge() at least
    for the net.  We can save such unneeded iterations if all netns in
    net_exit_list have no TIME_WAIT sockets.  This change eliminates
    the tax by the additional unshare() described in the next patch to
    guarantee the per-netns ehash size.
    
    Tested:
    
      # mount -t debugfs none /sys/kernel/debug/
      # echo cleanup_net > /sys/kernel/debug/tracing/set_ftrace_filter
      # echo inet_twsk_purge >> /sys/kernel/debug/tracing/set_ftrace_filter
      # echo function > /sys/kernel/debug/tracing/current_tracer
      # cat ./add_del_unshare.sh
      for i in `seq 1 40`
      do
          (for j in `seq 1 100` ; do  unshare -n /bin/true >/dev/null ; done) &
      done
      wait;
      # ./add_del_unshare.sh
    
    Before the patch:
    
      # cat /sys/kernel/debug/tracing/trace_pipe
        kworker/u128:0-8       [031] ...1.   174.162765: cleanup_net <-process_one_work
        kworker/u128:0-8       [031] ...1.   174.240796: inet_twsk_purge <-cleanup_net
        kworker/u128:0-8       [032] ...1.   174.244759: inet_twsk_purge <-tcp_sk_exit_batch
        kworker/u128:0-8       [034] ...1.   174.290861: cleanup_net <-process_one_work
        kworker/u128:0-8       [039] ...1.   175.245027: inet_twsk_purge <-cleanup_net
        kworker/u128:0-8       [046] ...1.   175.290541: inet_twsk_purge <-tcp_sk_exit_batch
        kworker/u128:0-8       [037] ...1.   175.321046: cleanup_net <-process_one_work
        kworker/u128:0-8       [024] ...1.   175.941633: inet_twsk_purge <-cleanup_net
        kworker/u128:0-8       [025] ...1.   176.242539: inet_twsk_purge <-tcp_sk_exit_batch
    
    After:
    
      # cat /sys/kernel/debug/tracing/trace_pipe
        kworker/u128:0-8       [038] ...1.   428.116174: cleanup_net <-process_one_work
        kworker/u128:0-8       [038] ...1.   428.262532: cleanup_net <-process_one_work
        kworker/u128:0-8       [030] ...1.   429.292645: cleanup_net <-process_one_work
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    edc12f03
tcp_ipv4.c 86.7 KB