[rfc] TCP timewait and credential handling - why would we get a TW with no credential?
Adrian Chadd
adrian at freebsd.org
Sun Jun 1 15:21:57 UTC 2014
Hi,
I've been seeing this panic under high very short-term connection TCP
throughput tests (30,000 connections a second) with SO_REUSEPORT:
Current language: auto; currently minimal
(kgdb) frame 11
#11 0xffffffff80a6bdf1 in tcp_twclose (tw=0xfffff801348b5780, reuse=0)
at /usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/tcp_timewait.c:644
644 crfree(tw->tw_cred);
(kgdb) frame 11
#11 0xffffffff80a6bdf1 in tcp_twclose (tw=0xfffff801348b5780, reuse=0)
at /usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/tcp_timewait.c:644
644 crfree(tw->tw_cred);
(kgdb) print tw
$1 = (struct tcptw *) 0xfffff801348b5780
(kgdb) print tw->tw_cred
$2 = (struct ucred *) 0x0
(kgdb)
and:
#10 0xffffffff808d017e in crfree (cr=0x0) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/kern/kern_prot.c:1837
#11 0xffffffff80a6bdf1 in tcp_twclose (tw=0xfffff801348b5780, reuse=0)
at /usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/tcp_timewait.c:644
#12 0xffffffff80a6bc53 in tcp_twcheck (inp=<value optimized out>,
to=<value optimized out>, th=<value optimized out>, m=<value optimized
out>, tlen=<value optimized out>) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/tcp_timewait.c:425
#13 0xffffffff80a5cf3f in tcp_input (m=<value optimized out>,
off0=<value optimized out>) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/tcp_input.c:949
#14 0xffffffff809fa4e7 in ip_input (m=0xfffff8004831e000) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/netinet/ip_input.c:729
#15 0xffffffff80998441 in netisr_dispatch_src (proto=<value optimized
out>, source=<value optimized out>, m=0xffffffff) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/net/netisr.c:972
#16 0xffffffff80990173 in ether_demux (ifp=<value optimized out>,
m=0xfffff8004831e000) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/net/if_ethersubr.c:775
#17 0xffffffff80990dce in ether_nh_input (m=<value optimized out>) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/net/if_ethersubr.c:582
#18 0xffffffff80998441 in netisr_dispatch_src (proto=<value optimized
out>, source=<value optimized out>, m=0xffffffff) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/net/netisr.c:972
#19 0xffffffff809903c6 in ether_input (ifp=<value optimized out>,
m=0x0) at /usr/home/adrian/git/github/erikarn/freebsd/sys/net/if_ethersubr.c:683
#20 0xffffffff804e9d67 in igb_rxeof (count=99) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/dev/e1000/if_igb.c:4882
#21 0xffffffff804ea47f in igb_msix_que (arg=0xfffff8000d47e670) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/dev/e1000/if_igb.c:1626
#22 0xffffffff808aef03 in intr_event_execute_handlers (p=<value
optimized out>, ie=0xfffff8000f76cb00) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/kern/kern_intr.c:1263
#23 0xffffffff808af866 in ithread_loop (arg=0xfffff8000f908d20) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/kern/kern_intr.c:1276
#24 0xffffffff808acc41 in fork_exit (callout=0xffffffff808af7d0
<ithread_loop>, arg=0xfffff8000f908d20, frame=0xfffffe1046c2cac0) at
/usr/home/adrian/git/github/erikarn/freebsd/sys/kern/kern_fork.c:977
#25 0xffffffff80c939ae in fork_trampoline () at
/usr/home/adrian/git/github/erikarn/freebsd/sys/amd64/amd64/exception.S:605
#26 0x0000000000000000 in ?? ()
... there's only one path to deleting the credentials and that's via
tcp_twclose() -> tcp_tw_2msl_stop().
Has anyone seen this kind of problem before?
-a
More information about the freebsd-net
mailing list