netmap receiver crashes driver on exit

Alexander V. Chernikov melifaro at yandex-team.ru
Wed Jul 10 08:32:29 UTC 2013


Hello list!

It seems there are still some rough edges with netmap api.
I'm currently experimenting with netmap receiver on  fresh -current 
(r252470) and ixgbe.
Every time the receiver is killed/coredumped/or ^C'd (stock pkt-gen with 
-f rx can act as such receiver), after some random pause (10-300 
seconds) the crash comes:

kgdb) bt
#0  doadump (textdump=<value optimized out>) at pcpu.h:236
#1  0xffffffff8083ed70 in kern_reboot (howto=260) at 
/home/melifaro/netmap_10/sys/kern/kern_shutdown.c:447
#2  0xffffffff8083f135 in panic (fmt=<value optimized out>) at 
/home/melifaro/netmap_10/sys/kern/kern_shutdown.c:754
#3  0xffffffff80bbb1b5 in trap_fatal (frame=<value optimized out>, 
eva=<value optimized out>) at 
/home/melifaro/netmap_10/sys/amd64/amd64/trap.c:873
#4  0xffffffff80bbb48b in trap_pfault (frame=0x0, usermode=0) at 
/home/melifaro/netmap_10/sys/amd64/amd64/trap.c:699
#5  0xffffffff80bbac55 in trap (frame=0xffffff9046d52810) at 
/home/melifaro/netmap_10/sys/amd64/amd64/trap.c:463
#6  0xffffffff80ba4ff2 in calltrap () at exception.S:232
#7  0xffffffff81a22051 in ixgbe_rxeof (que=0xfffffe0e1f6ce000) at 
/home/melifaro/netmap_10/sys/modules/ixgbe/../../dev/ixgbe/ixgbe.c:4484
#8  0xffffffff81a22e55 in ixgbe_msix_que (arg=0xfffffe0e1f6ce000) at 
/home/melifaro/netmap_10/sys/modules/ixgbe/../../dev/ixgbe/ixgbe.c:1515
#9  0xffffffff80812f28 in intr_event_execute_handlers (p=<value 
optimized out>, ie=0xfffffe012083f300) at 
/home/melifaro/netmap_10/sys/kern/kern_intr.c:1263
#10 0xffffffff808133f8 in ithread_loop (arg=0xfffffe0120849820) at 
/home/melifaro/netmap_10/sys/kern/kern_intr.c:1276
#11 0xffffffff80810bea in fork_exit (callout=0xffffffff808132d0 
<ithread_loop>, arg=0xfffffe0120849820, frame=0xffffff9046d52ac0) at 
/home/melifaro/netmap_10/sys/kern/kern_fork.c:991
#12 0xffffffff80ba552e in fork_trampoline () at exception.S:606
#13 0x0000000000000000 in ?? ()

(kgdb) up 7
#7  0xffffffff81a22051 in ixgbe_rxeof (que=0xfffffe0e1f6ce000) at 
/home/melifaro/netmap_10/sys/modules/ixgbe/../../dev/ixgbe/ixgbe.c:4484
4484                    mp->m_len = len;

(kgdb) p mp
$1 = (struct mbuf *) 0x0
(kgdb) p i
$2 = 279
(kgdb) p *rxr
$3 = {adapter = 0xffffff8001245000, rx_mtx = {lock_object = {lo_name = 
0xfffffe0d52a7f0ae "ix0:rx(0)", lo_flags = 16973824, lo_data = 0, 
lo_witness = 0x0}, mtx_lock = 18446741879526785024}, me = 0,
   rx_base = 0xffffff9046d43000, rxdma = {dma_paddr = 4822675456, 
dma_vaddr = 0xffffff9046d43000 "", dma_tag = 0xfffffe01301d8e00, dma_map 
= 0xffffffff812bbf08, dma_seg = {ds_addr = 0, ds_len = 0}, dma_size = 
16384,
     dma_nseg = 0}, lro = {ifp = 0x0, lro_queued = 0, lro_flushed = 0, 
lro_bad_csum = 0, lro_cnt = 0, lro_active = {slh_first = 0x0}, lro_free 
= {slh_first = 0x0}}, lro_enabled = false, hw_rsc = false, discard = false,
   vtag_strip = false, next_to_refresh = 277, next_to_check = 279, 
num_desc = 1024, mbuf_sz = 2048, process_limit = 65535, mtx_name = 
"ix0:rx(0)\000\000\000\000\000\000", rx_buffers = 0xffffff81cb9e5000,
   ptag = 0xfffffe01301d8300, bytes = 174, packets = 0, rx_irq = 0, 
rx_copies = 522, rx_packets = 3631, rx_bytes = 196720, rx_discarded = 0, 
rsc_num = 0, flm = 0}
(kgdb) p rbuf
$4 = (struct ixgbe_rx_buf *) 0xffffff81cb9e7b98
(kgdb) p *rbuf
$5 = {buf = 0x0, fmp = 0x0, pmap = 0x0, flags = 0, addr = 6467809280}

More specifically:
small traffic rate (~180 packets/s) was constantly flowing on ix0 (so 
each interrupt grabs 1 packet)
ix0 was opened by netmap for several seconds. After that, netmap program 
was killed
Panic usually follows after ~30 seconds

ix configuration: 4q, ring length: 1024

some more investigation (from other similar dump):

define list_ring

         set $rxr = (struct rx_ring *)$arg0
         set $i = 0

         while $i < $rxr->num_desc
                 set $rbuf = &$rxr->rx_buffers[$i]

                 if $rbuf->buf == 0
                         p $i
                         p *$rbuf
                 end
                 set $i = $i + 1
         end

         p $i
end

(kgdb) p ifindex_table[3]->ife_ifnet->if_xname
$553 = "ix0", '\0' <repeats 12 times>
(kgdb) p ifindex_table[4]->ife_ifnet->if_xname
$554 = "ix1", '\0' <repeats 12 times>

kgdb) p &((struct adapter 
*)ifindex_table[3]->ife_ifnet->if_softc)->rx_rings[0]
$529 = (struct rx_ring *) 0xfffffe0120846800
(kgdb) p &((struct adapter 
*)ifindex_table[3]->ife_ifnet->if_softc)->rx_rings[1]
$530 = (struct rx_ring *) 0xfffffe0120846910
(kgdb) p &((struct adapter 
*)ifindex_table[3]->ife_ifnet->if_softc)->rx_rings[2]
$531 = (struct rx_ring *) 0xfffffe0120846a20
(kgdb) p &((struct adapter 
*)ifindex_table[3]->ife_ifnet->if_softc)->rx_rings[3]
$532 = (struct rx_ring *) 0xfffffe0120846b30
(kgdb) list_ring $529
$533 = 1024
(kgdb) list_ring $530
$534 = 591
$535 = {buf = 0x0, fmp = 0x0, pmap = 0x0, flags = 0, addr = 0}
$536 = 1024
(kgdb) list_ring $531
$537 = 274
$538 = {buf = 0x0, fmp = 0x0, pmap = 0x0, flags = 0, addr = 0}
$539 = 276
$540 = {buf = 0x0, fmp = 0x0, pmap = 0x0, flags = 0, addr = 0}
$541 = 1024
(kgdb) list_ring $532
$542 = 592
$543 = {buf = 0x0, fmp = 0x0, pmap = 0x0, flags = 0, addr = 6021709824}
$544 = 1024
(kgdb) p &((struct adapter 
*)ifindex_table[4]->ife_ifnet->if_softc)->rx_rings[0]
$545 = (struct rx_ring *) 0xfffffe0120845000
(kgdb) p &((struct adapter 
*)ifindex_table[4]->ife_ifnet->if_softc)->rx_rings[1]
$546 = (struct rx_ring *) 0xfffffe0120845110
(kgdb) p &((struct adapter 
*)ifindex_table[4]->ife_ifnet->if_softc)->rx_rings[2]
$547 = (struct rx_ring *) 0xfffffe0120845220
(kgdb) p &((struct adapter 
*)ifindex_table[4]->ife_ifnet->if_softc)->rx_rings[3]
$548 = (struct rx_ring *) 0xfffffe0120845330
(kgdb) list_ring $545
$549 = 1024
(kgdb) list_ring $546
$550 = 1024
(kgdb) list_ring $547
$551 = 1024
(kgdb) list_ring $548
$552 = 1024


What can I do to further debug/fix this issue?











More information about the freebsd-net mailing list