Author: shurd
Date: Thu Sep  6 18:51:52 2018
New Revision: 338505
URL: https://svnweb.freebsd.org/changeset/base/338505

Log:
  Clean up iflib sysctls
  
  Remove sysctls:
  txq_drain_encapfail - now a duplicate of encap_txd_encap_fail
  intr_link - was never incremented
  intr_msix - was never incremented
  rx_zero_len - was never incremented
  
  The following were not incremented in all code-paths that apply:
  m_pullups, mbuf_defrag, rxd_flush, tx_encap, rx_intr_enables, tx_frees,
  encap_txd_encap_fail.
  
  Fixes:
  Replace the broken collapse_pkthdr() implementation with an MPASS().
  fl_refills and fl_refills_large were not incremented when using netmap.
  
  Reviewed by:  gallatin
  Approved by:  re (marius)
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D16733

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c        Thu Sep  6 18:45:31 2018        (r338504)
+++ head/sys/net/iflib.c        Thu Sep  6 18:51:52 2018        (r338505)
@@ -641,7 +641,6 @@ SYSCTL_INT(_net_iflib, OID_AUTO, fl_refills_large, CTL
 static int iflib_txq_drain_flushing;
 static int iflib_txq_drain_oactive;
 static int iflib_txq_drain_notready;
-static int iflib_txq_drain_encapfail;
 
 SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_flushing, CTLFLAG_RD,
                   &iflib_txq_drain_flushing, 0, "# drain flushes");
@@ -649,8 +648,6 @@ SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_oactive, CT
                   &iflib_txq_drain_oactive, 0, "# drain oactives");
 SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_notready, CTLFLAG_RD,
                   &iflib_txq_drain_notready, 0, "# drain notready");
-SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_encapfail, CTLFLAG_RD,
-                  &iflib_txq_drain_encapfail, 0, "# drain encap fails");
 
 
 static int iflib_encap_load_mbuf_fail;
@@ -670,21 +667,14 @@ SYSCTL_INT(_net_iflib, OID_AUTO, encap_txd_encap_fail,
 static int iflib_task_fn_rxs;
 static int iflib_rx_intr_enables;
 static int iflib_fast_intrs;
-static int iflib_intr_link;
-static int iflib_intr_msix; 
 static int iflib_rx_unavail;
 static int iflib_rx_ctx_inactive;
-static int iflib_rx_zero_len;
 static int iflib_rx_if_input;
 static int iflib_rx_mbuf_null;
 static int iflib_rxd_flush;
 
 static int iflib_verbose_debug;
 
-SYSCTL_INT(_net_iflib, OID_AUTO, intr_link, CTLFLAG_RD,
-                  &iflib_intr_link, 0, "# intr link calls");
-SYSCTL_INT(_net_iflib, OID_AUTO, intr_msix, CTLFLAG_RD,
-                  &iflib_intr_msix, 0, "# intr msix calls");
 SYSCTL_INT(_net_iflib, OID_AUTO, task_fn_rx, CTLFLAG_RD,
                   &iflib_task_fn_rxs, 0, "# task_fn_rx calls");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_intr_enables, CTLFLAG_RD,
@@ -695,8 +685,6 @@ SYSCTL_INT(_net_iflib, OID_AUTO, rx_unavail, CTLFLAG_R
                   &iflib_rx_unavail, 0, "# times rxeof called with no 
available data");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_ctx_inactive, CTLFLAG_RD,
                   &iflib_rx_ctx_inactive, 0, "# times rxeof called with 
inactive context");
-SYSCTL_INT(_net_iflib, OID_AUTO, rx_zero_len, CTLFLAG_RD,
-                  &iflib_rx_zero_len, 0, "# times rxeof saw zero len mbuf");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_if_input, CTLFLAG_RD,
                   &iflib_rx_if_input, 0, "# times rxeof called if_input");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_mbuf_null, CTLFLAG_RD,
@@ -713,12 +701,12 @@ iflib_debug_reset(void)
        iflib_tx_seen = iflib_tx_sent = iflib_tx_encap = iflib_rx_allocs =
                iflib_fl_refills = iflib_fl_refills_large = iflib_tx_frees =
                iflib_txq_drain_flushing = iflib_txq_drain_oactive =
-               iflib_txq_drain_notready = iflib_txq_drain_encapfail =
+               iflib_txq_drain_notready =
                iflib_encap_load_mbuf_fail = iflib_encap_pad_mbuf_fail =
                iflib_encap_txq_avail_fail = iflib_encap_txd_encap_fail =
                iflib_task_fn_rxs = iflib_rx_intr_enables = iflib_fast_intrs =
-               iflib_intr_link = iflib_intr_msix = iflib_rx_unavail =
-               iflib_rx_ctx_inactive = iflib_rx_zero_len = iflib_rx_if_input =
+               iflib_rx_unavail =
+               iflib_rx_ctx_inactive = iflib_rx_if_input =
                iflib_rx_mbuf_null = iflib_rxd_flush = 0;
 }
 
@@ -839,6 +827,9 @@ netmap_fl_refill(iflib_rxq_t rxq, struct netmap_kring 
        if_ctx_t ctx = rxq->ifr_ctx;
        iflib_fl_t fl = &rxq->ifr_fl[0];
        uint32_t refill_pidx, nic_i;
+#if IFLIB_DEBUG_COUNTERS
+       int rf_count = 0;
+#endif
 
        if (nm_i == head && __predict_true(!init))
                return 0;
@@ -851,7 +842,12 @@ netmap_fl_refill(iflib_rxq_t rxq, struct netmap_kring 
         */
        head = nm_prev(head, lim);
        nic_i = UINT_MAX;
+       DBG_COUNTER_INC(fl_refills);
        while (nm_i != head) {
+#if IFLIB_DEBUG_COUNTERS
+               if (++rf_count == 9)
+                       DBG_COUNTER_INC(fl_refills_large);
+#endif
                for (int tmp_pidx = 0; tmp_pidx < IFLIB_MAX_RX_REFRESH && nm_i 
!= head; tmp_pidx++) {
                        struct netmap_slot *slot = &ring->slot[nm_i];
                        void *addr = PNMB(na, slot, 
&fl->ifl_bus_addrs[tmp_pidx]);
@@ -898,8 +894,10 @@ netmap_fl_refill(iflib_rxq_t rxq, struct netmap_kring 
        if (map)
                bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map,
                                BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
-       if (__predict_true(nic_i != UINT_MAX))
+       if (__predict_true(nic_i != UINT_MAX)) {
                ctx->isc_rxd_flush(ctx->ifc_softc, rxq->ifr_id, fl->ifl_id, 
nic_i);
+               DBG_COUNTER_INC(rxd_flush);
+       }
        return (0);
 }
 
@@ -998,6 +996,7 @@ iflib_netmap_txsync(struct netmap_kring *kring, int fl
 
                        /* Fill the slot in the NIC ring. */
                        ctx->isc_txd_encap(ctx->ifc_softc, &pi);
+                       DBG_COUNTER_INC(tx_encap);
 
                        /* prefetch for next round */
                        __builtin_prefetch(&ring->slot[nm_i + 1]);
@@ -1524,8 +1523,10 @@ iflib_fast_intr_rxtx(void *arg)
                cidx = rxq->ifr_fl[0].ifl_cidx;
        if (iflib_rxd_avail(ctx, rxq, cidx, 1))
                GROUPTASK_ENQUEUE(gtask);
-       else
+       else {
                IFDI_RX_QUEUE_INTR_ENABLE(ctx, rxq->ifr_id);
+               DBG_COUNTER_INC(rx_intr_enables);
+       }
        return (FILTER_HANDLED);
 }
 
@@ -2887,6 +2888,7 @@ iflib_parse_header(iflib_txq_t txq, if_pkt_info_t pi, 
                        return (ENOMEM);
                } else {
                        m_freem(*mp);
+                       DBG_COUNTER_INC(tx_frees);
                        *mp = m;
                }
        }
@@ -2994,6 +2996,7 @@ iflib_parse_header(iflib_txq_t txq, if_pkt_info_t pi, 
                pi->ipi_ip_hlen = sizeof(struct ip6_hdr);
 
                if (__predict_false(m->m_len < pi->ipi_ehdrlen + sizeof(struct 
ip6_hdr))) {
+                       txq->ift_pullups++;
                        if (__predict_false((m = m_pullup(m, pi->ipi_ehdrlen + 
sizeof(struct ip6_hdr))) == NULL))
                                return (ENOMEM);
                }
@@ -3041,34 +3044,6 @@ iflib_parse_header(iflib_txq_t txq, if_pkt_info_t pi, 
        return (0);
 }
 
-static  __noinline  struct mbuf *
-collapse_pkthdr(struct mbuf *m0)
-{
-       struct mbuf *m, *m_next, *tmp;
-
-       m = m0;
-       m_next = m->m_next;
-       while (m_next != NULL && m_next->m_len == 0) {
-               m = m_next;
-               m->m_next = NULL;
-               m_free(m);
-               m_next = m_next->m_next;
-       }
-       m = m0;
-       m->m_next = m_next;
-       if (m_next == NULL)
-               return (m);
-       if ((m_next->m_flags & M_EXT) == 0) {
-               m = m_defrag(m, M_NOWAIT);
-       } else {
-               tmp = m_next->m_next;
-               memcpy(m_next, m, MPKTHSIZE);
-               m = m_next;
-               m->m_next = tmp;
-       }
-       return (m);
-}
-
 /*
  * If dodgy hardware rejects the scatter gather chain we've handed it
  * we'll need to remove the mbuf chain from ifsg_m[] before we can add the
@@ -3117,8 +3092,7 @@ iflib_busdma_load_mbuf_sg(iflib_txq_t txq, bus_dma_tag
        /*
         * Please don't ever do this
         */
-       if (__predict_false(m->m_len == 0))
-               *m0 = collapse_pkthdr(m);
+       MPASS(__predict_true(m->m_len > 0));
 
        ctx = txq->ift_ctx;
        sctx = ctx->ifc_sctx;
@@ -3259,6 +3233,7 @@ iflib_ether_pad(device_t dev, struct mbuf **m_head, ui
                        m_freem(*m_head);
                        device_printf(dev, "cannot pad short frame, m_dup() 
failed");
                        DBG_COUNTER_INC(encap_pad_mbuf_fail);
+                       DBG_COUNTER_INC(tx_frees);
                        return ENOMEM;
                }
                m_freem(*m_head);
@@ -3274,6 +3249,7 @@ iflib_ether_pad(device_t dev, struct mbuf **m_head, ui
                m_freem(*m_head);
                device_printf(dev, "cannot pad short frame\n");
                DBG_COUNTER_INC(encap_pad_mbuf_fail);
+               DBG_COUNTER_INC(tx_frees);
                return (ENOBUFS);
        }
 
@@ -3337,8 +3313,10 @@ iflib_encap(iflib_txq_t txq, struct mbuf **m_headp)
        if ((sctx->isc_flags & IFLIB_NEED_ETHER_PAD) &&
            __predict_false(m_head->m_pkthdr.len < scctx->isc_min_frame_size)) {
                err = iflib_ether_pad(ctx->ifc_dev, m_headp, 
scctx->isc_min_frame_size);
-               if (err)
+               if (err) {
+                       DBG_COUNTER_INC(encap_txd_encap_fail);
                        return err;
+               }
        }
        m_head = *m_headp;
 
@@ -3352,8 +3330,10 @@ iflib_encap(iflib_txq_t txq, struct mbuf **m_headp)
 
        /* deliberate bitwise OR to make one condition */
        if (__predict_true((pi.ipi_csum_flags | pi.ipi_vtag))) {
-               if (__predict_false((err = iflib_parse_header(txq, &pi, 
m_headp)) != 0))
+               if (__predict_false((err = iflib_parse_header(txq, &pi, 
m_headp)) != 0)) {
+                       DBG_COUNTER_INC(encap_txd_encap_fail);
                        return (err);
+               }
                m_head = *m_headp;
        }
 
@@ -3370,12 +3350,13 @@ defrag:
                                if (m_head == NULL)
                                        remap++;
                        }
-                       if (remap == 1)
+                       if (remap == 1) {
+                               txq->ift_mbuf_defrag++;
                                m_head = m_defrag(*m_headp, M_NOWAIT);
+                       }
                        remap++;
                        if (__predict_false(m_head == NULL))
                                goto defrag_failed;
-                       txq->ift_mbuf_defrag++;
                        *m_headp = m_head;
                        goto retry;
                        break;
@@ -3391,6 +3372,7 @@ defrag:
                }
                txq->ift_map_failed++;
                DBG_COUNTER_INC(encap_load_mbuf_fail);
+               DBG_COUNTER_INC(encap_txd_encap_fail);
                return (err);
        }
 
@@ -3404,6 +3386,7 @@ defrag:
                if (map != NULL)
                        bus_dmamap_unload(desc_tag, map);
                DBG_COUNTER_INC(encap_txq_avail_fail);
+               DBG_COUNTER_INC(encap_txd_encap_fail);
                if ((txq->ift_task.gt_task.ta_flags & TASK_ENQUEUED) == 0)
                        GROUPTASK_ENQUEUE(&txq->ift_task);
                return (ENOBUFS);
@@ -3466,9 +3449,12 @@ defrag:
                                goto defrag;
                        }
                }
-               DBG_COUNTER_INC(encap_txd_encap_fail);
                goto defrag_failed;
        }
+       /*
+        * err can't possibly be non-zero here, so we don't neet to test it
+        * to see if we need to DBG_COUNTER_INC(encap_txd_encap_fail).
+        */
        return (err);
 
 defrag_failed:
@@ -3477,6 +3463,7 @@ defrag_failed:
        m_freem(*m_headp);
        DBG_COUNTER_INC(tx_frees);
        *m_headp = NULL;
+       DBG_COUNTER_INC(encap_txd_encap_fail);
        return (ENOMEM);
 }
 
@@ -3676,12 +3663,10 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, ui
                in_use_prev = txq->ift_in_use;
                err = iflib_encap(txq, mp);
                if (__predict_false(err)) {
-                       DBG_COUNTER_INC(txq_drain_encapfail);
                        /* no room - bail out */
                        if (err == ENOBUFS)
                                break;
                        consumed++;
-                       DBG_COUNTER_INC(txq_drain_encapfail);
                        /* we can't send this packet - skip it */
                        continue;
                }
@@ -3741,6 +3726,7 @@ iflib_txq_drain_free(struct ifmp_ring *r, uint32_t cid
                if (__predict_false(*mp == (struct mbuf *)txq))
                        continue;
                m_freem(*mp);
+               DBG_COUNTER_INC(tx_frees);
        }
        MPASS(ifmp_ring_is_stalled(r) == 0);
        return (avail);
@@ -3987,6 +3973,7 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
                        next = m->m_nextpkt;
                        m->m_nextpkt = NULL;
                        m_freem(m);
+                       DBG_COUNTER_INC(tx_frees);
                        m = next;
                }
                return (ENOBUFS);
@@ -4029,6 +4016,7 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
 #endif
                ifmp_ring_check_drainage(txq->ift_br, TX_BATCH_SIZE);
                m_freem(m);
+               DBG_COUNTER_INC(tx_frees);
        }
 
        return (err);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to