⬢ DragonFlyBSD Kernel Audit
DF-3426 / rig_trace.patch
← back to finding ↓ download raw
--- 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);