Date: Tue, 9 Sep 2014 13:41:25 -0700 From: Adrian Chadd <adrian@freebsd.org> To: FreeBSD Net <freebsd-net@freebsd.org> Subject: inpcb lookups in udp_send -> inpcb laddr and flowtable Message-ID: <CAJ-VmomvWV0uxrxh%2BP3UbGOpc1rvY89UXnFfwWJ-j%2B%2B-n1m=BA@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi! I found this whilst doing UDP RSS testing. root@adrian-hackbox:/home/adrian/work/freebsd/head/src/sys/net # sysctl debug.lock.prof.stats | head -2 ; sysctl debug.lock.prof.stats | sort -nk4 | tail -5 debug.lock.prof.stats: max wait_max total wait_total count avg wait_avg cnt_hold cnt_lock name 40 11 114900 55276 359106 0 0 0 20962 /usr/home/adrian/work/freebsd/head/src/sys/dev/ixgbe/ixgbe.c:1550 (sleep mutex:ix0:tx(6)) 21 11 144253 71959 454169 0 0 0 27506 /usr/home/adrian/work/freebsd/head/src/sys/dev/ixgbe/ixgbe.c:1550 (sleep mutex:ix0:tx(1)) 9 10 3132066 85999 42942422 0 0 0 35943 /usr/home/adrian/work/freebsd/head/src/sys/netinet/udp_usrreq.c:369 (sleep mutex:so_rcv) 676 1713 805307 169654 7076283 0 0 0 69741 /usr/home/adrian/work/freebsd/head/src/sys/netinet/in_pcb.c:963 (sleep mutex:rtentry) 674 4426 2111324 6415012 7076284 0 0 0 489745 /usr/home/adrian/work/freebsd/head/src/sys/net/route.c:420 (sleep mutex:rtentry) then... root@adrian-hackbox:/home/adrian/git/github/erikarn/freebsd-rss/rss-udp-srv # dtrace -n 'fbt::rtalloc1_fib:entry { @[stack()] = count(); }' dtrace: description 'fbt::rtalloc1_fib:entry ' matched 1 probe ^[[A^C kernel`rtalloc_ign_fib+0x98 kernel`in_pcbladdr+0x7d kernel`in_pcbconnect_setup+0x1af kernel`udp_send+0x4af kernel`sosend_dgram+0x30b kernel`kern_sendit+0x20b kernel`sendit+0x129 kernel`sys_sendto+0x4d kernel`amd64_syscall+0x25a kernel`0xffffffff80cd178b 1848628 It turns out that if a local address isn't bound (ie, it's INADDR_ANY) then in_pcbladdr() will do a route table lookup to find the interface to transmit from. The v4/v6 laddr paths don't know about flowtable; they just do a routing table lookup. I'm currently experimenting with a kernel fix to use flowtable here for IPv4 UDP sockets but I'm not sure about the IPv6 path (the source interface/address selection is much crazier with all the various scope bits going on.) I'd like some help with the IPv6 source selection please! Thanks! -a
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmomvWV0uxrxh%2BP3UbGOpc1rvY89UXnFfwWJ-j%2B%2B-n1m=BA>