DF-3427 / rig_trace.patch
--- netmap_generic.c.orig 2026-10-14 02:03:45.213744807 +0000 +++ netmap_generic.c 2026-10-14 02:04:15.245357597 +0000 @@ -322,6 +322,11 @@ static void generic_mbuf_destructor(struct mbuf *m) { +#ifdef RIG_TRACE + kprintf("RIG: generic_mbuf_destructor CALLED m=%p " + "(ABI-incoherent ext_free(ext_arg) entry)\n", m); + print_backtrace(-6); +#endif if (netmap_verbose) D("Tx irq (%p) queue %d", m, MBUF_TXQ(m)); netmap_generic_irq(MBUF_IFP(m), MBUF_TXQ(m), NULL); @@ -428,6 +433,11 @@ } e = generic_tx_event_middle(kring, hwcur); +#ifdef RIG_TRACE + kprintf("RIG: generic_set_tx_event e=%u mbuf=%p " + "(SET_MBUF_DESTRUCTOR + m_freem on pool entry)\n", + e, kring->tx_pool[e]); +#endif m = kring->tx_pool[e]; if (m == NULL) { /* This can happen if there is already an event on the netmap @@ -463,6 +473,11 @@ IFRATE(rate_ctx.new.txsync++); +#ifdef RIG_TRACE + kprintf("RIG: txsync enter: cur=%u hwcur=%u ntc=%u hwavail=%d resv=%d\n", + ring->cur, kring->nr_hwcur, kring->nr_ntc, + (int)kring->nr_hwavail, kring->nr_hwreserved); +#endif // TODO: handle the case of mbuf allocation failure /* first, reclaim completed buffers */ generic_netmap_tx_clean(kring); @@ -518,6 +533,12 @@ * ring->avail == 0 || j != k */ tx_ret = generic_xmit_frame(ifp, m, addr, len, ring_nr); +#ifdef RIG_TRACE + if (tx_ret) + kprintf("RIG: xmit dispatch FAILED ret=%d j=%u ntc=%u " + "hwavail=%d -> arming event\n", + tx_ret, j, kring->nr_ntc, (int)kring->nr_hwavail); +#endif if (unlikely(tx_ret)) { RD(5, "start_xmit failed: err %d [%u,%u,%u,%u]", tx_ret, kring->nr_ntc, j, k, kring->nr_hwavail); @@ -570,6 +591,10 @@ * No doublecheck is performed, since txsync() will be * called twice by netmap_poll(). */ +#ifdef RIG_TRACE + kprintf("RIG: txsync ring exhausted: ntc=%u j=%u " + "hwavail=0 -> arming event\n", kring->nr_ntc, j); +#endif generic_set_tx_event(kring, j); } ND("tx #%d, hwavail = %d", n, kring->nr_hwavail); |