Author: erj
Date: Wed Apr 17 23:02:37 2019
New Revision: 346337
URL: https://svnweb.freebsd.org/changeset/base/346337

Log:
  MFC r345303, r345305, r345657, r345658
  
  Includes:
  - iflib: prevent possible infinite loop in iflib_encap
  - iflib: expose the Rx mbuf buffer size to drivers
  - iflib: hold the CTX lock in iflib_pseudo_register
  - iflib: return ENETDOWN when the network device is down

Modified:
  stable/12/sys/dev/e1000/if_em.c
  stable/12/sys/dev/ixgbe/if_ix.c
  stable/12/sys/dev/ixgbe/if_ixv.c
  stable/12/sys/dev/ixl/if_iavf.c
  stable/12/sys/dev/ixl/ixl_pf_main.c
  stable/12/sys/net/iflib.c
  stable/12/sys/net/iflib.h
  stable/12/sys/sys/param.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/e1000/if_em.c
==============================================================================
--- stable/12/sys/dev/e1000/if_em.c     Wed Apr 17 22:45:19 2019        
(r346336)
+++ stable/12/sys/dev/e1000/if_em.c     Wed Apr 17 23:02:37 2019        
(r346337)
@@ -1270,14 +1270,7 @@ em_if_init(if_ctx_t ctx)
        /* Setup Multicast table */
        em_if_multi_set(ctx);
 
-       /*
-        * Figure out the desired mbuf
-        * pool for doing jumbos
-        */
-       if (adapter->hw.mac.max_frame_size <= 2048)
-               adapter->rx_mbuf_sz = MCLBYTES;
-       else
-               adapter->rx_mbuf_sz = MJUMPAGESIZE;
+       adapter->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx);
        em_initialize_receive_unit(ctx);
 
        /* Use real VLAN Filter support? */

Modified: stable/12/sys/dev/ixgbe/if_ix.c
==============================================================================
--- stable/12/sys/dev/ixgbe/if_ix.c     Wed Apr 17 22:45:19 2019        
(r346336)
+++ stable/12/sys/dev/ixgbe/if_ix.c     Wed Apr 17 23:02:37 2019        
(r346337)
@@ -2880,10 +2880,7 @@ ixgbe_if_init(if_ctx_t ctx)
        ixgbe_if_multi_set(ctx);
 
        /* Determine the correct mbuf pool, based on frame size */
-       if (adapter->max_frame_size <= MCLBYTES)
-               adapter->rx_mbuf_sz = MCLBYTES;
-       else
-               adapter->rx_mbuf_sz = MJUMPAGESIZE;
+       adapter->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx);
 
        /* Configure RX settings */
        ixgbe_initialize_receive_units(ctx);

Modified: stable/12/sys/dev/ixgbe/if_ixv.c
==============================================================================
--- stable/12/sys/dev/ixgbe/if_ixv.c    Wed Apr 17 22:45:19 2019        
(r346336)
+++ stable/12/sys/dev/ixgbe/if_ixv.c    Wed Apr 17 23:02:37 2019        
(r346337)
@@ -629,14 +629,7 @@ ixv_if_init(if_ctx_t ctx)
        /* Setup Multicast table */
        ixv_if_multi_set(ctx);
 
-       /*
-        * Determine the correct mbuf pool
-        * for doing jumbo/headersplit
-        */
-       if (ifp->if_mtu > ETHERMTU)
-               adapter->rx_mbuf_sz = MJUMPAGESIZE;
-       else
-               adapter->rx_mbuf_sz = MCLBYTES;
+       adapter->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx);
 
        /* Configure RX settings */
        ixv_initialize_receive_units(ctx);

Modified: stable/12/sys/dev/ixl/if_iavf.c
==============================================================================
--- stable/12/sys/dev/ixl/if_iavf.c     Wed Apr 17 22:45:19 2019        
(r346336)
+++ stable/12/sys/dev/ixl/if_iavf.c     Wed Apr 17 23:02:37 2019        
(r346337)
@@ -614,7 +614,6 @@ iavf_send_vc_msg(struct iavf_sc *sc, u32 op)
 static void
 iavf_init_queues(struct ixl_vsi *vsi)
 {
-       if_softc_ctx_t scctx = vsi->shared;
        struct ixl_tx_queue *tx_que = vsi->tx_queues;
        struct ixl_rx_queue *rx_que = vsi->rx_queues;
        struct rx_ring *rxr;
@@ -625,10 +624,7 @@ iavf_init_queues(struct ixl_vsi *vsi)
        for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++) {
                rxr = &rx_que->rxr;
 
-               if (scctx->isc_max_frame_size <= MCLBYTES)
-                       rxr->mbuf_sz = MCLBYTES;
-               else
-                       rxr->mbuf_sz = MJUMPAGESIZE;
+               rxr->mbuf_sz = iflib_get_rx_mbuf_sz(vsi->ctx);
 
                wr32(vsi->hw, rxr->tail, 0);
        }

Modified: stable/12/sys/dev/ixl/ixl_pf_main.c
==============================================================================
--- stable/12/sys/dev/ixl/ixl_pf_main.c Wed Apr 17 22:45:19 2019        
(r346336)
+++ stable/12/sys/dev/ixl/ixl_pf_main.c Wed Apr 17 23:02:37 2019        
(r346337)
@@ -1300,10 +1300,7 @@ ixl_initialize_vsi(struct ixl_vsi *vsi)
                struct i40e_hmc_obj_rxq rctx;
 
                /* Next setup the HMC RX Context  */
-               if (scctx->isc_max_frame_size <= MCLBYTES)
-                       rxr->mbuf_sz = MCLBYTES;
-               else
-                       rxr->mbuf_sz = MJUMPAGESIZE;
+               rxr->mbuf_sz = iflib_get_rx_mbuf_sz(vsi->ctx);
 
                u16 max_rxmax = rxr->mbuf_sz * hw->func_caps.rx_buf_chain_len;
 

Modified: stable/12/sys/net/iflib.c
==============================================================================
--- stable/12/sys/net/iflib.c   Wed Apr 17 22:45:19 2019        (r346336)
+++ stable/12/sys/net/iflib.c   Wed Apr 17 23:02:37 2019        (r346337)
@@ -171,6 +171,7 @@ struct iflib_ctx {
        uint32_t ifc_if_flags;
        uint32_t ifc_flags;
        uint32_t ifc_max_fl_buf_size;
+       uint32_t ifc_rx_mbuf_sz;
 
        int ifc_link_state;
        int ifc_link_irq;
@@ -2167,7 +2168,6 @@ iflib_fl_setup(iflib_fl_t fl)
 {
        iflib_rxq_t rxq = fl->ifl_rxq;
        if_ctx_t ctx = rxq->ifr_ctx;
-       if_softc_ctx_t sctx = &ctx->ifc_softc_ctx;
 
        bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1);
        /*
@@ -2176,14 +2176,7 @@ iflib_fl_setup(iflib_fl_t fl)
        iflib_fl_bufs_free(fl);
        /* Now replenish the mbufs */
        MPASS(fl->ifl_credits == 0);
-       /*
-        * XXX don't set the max_frame_size to larger
-        * than the hardware can handle
-        */
-       if (sctx->isc_max_frame_size <= 2048)
-               fl->ifl_buf_size = MCLBYTES;
-       else
-               fl->ifl_buf_size = MJUMPAGESIZE;
+       fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz;
        if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size)
                ctx->ifc_max_fl_buf_size = fl->ifl_buf_size;
        fl->ifl_cltype = m_gettype(fl->ifl_buf_size);
@@ -2309,6 +2302,27 @@ iflib_timer(void *arg)
 }
 
 static void
+iflib_calc_rx_mbuf_sz(if_ctx_t ctx)
+{
+       if_softc_ctx_t sctx = &ctx->ifc_softc_ctx;
+
+       /*
+        * XXX don't set the max_frame_size to larger
+        * than the hardware can handle
+        */
+       if (sctx->isc_max_frame_size <= MCLBYTES)
+               ctx->ifc_rx_mbuf_sz = MCLBYTES;
+       else
+               ctx->ifc_rx_mbuf_sz = MJUMPAGESIZE;
+}
+
+uint32_t
+iflib_get_rx_mbuf_sz(if_ctx_t ctx)
+{
+       return (ctx->ifc_rx_mbuf_sz);
+}
+
+static void
 iflib_init_locked(if_ctx_t ctx)
 {
        if_softc_ctx_t sctx = &ctx->ifc_softc_ctx;
@@ -2342,6 +2356,14 @@ iflib_init_locked(if_ctx_t ctx)
                CALLOUT_UNLOCK(txq);
                iflib_netmap_txq_init(ctx, txq);
        }
+
+       /*
+        * Calculate a suitable Rx mbuf size prior to calling IFDI_INIT, so
+        * that drivers can use the value when setting up the hardware receive
+        * buffers.
+        */
+       iflib_calc_rx_mbuf_sz(ctx);
+
 #ifdef INVARIANTS
        i = if_getdrvflags(ifp);
 #endif
@@ -3280,9 +3302,14 @@ defrag:
                                txq->ift_mbuf_defrag++;
                                m_head = m_defrag(*m_headp, M_NOWAIT);
                        }
-                       remap++;
-                       if (__predict_false(m_head == NULL))
+                       /*
+                        * remap should never be >1 unless 
bus_dmamap_load_mbuf_sg
+                        * failed to map an mbuf that was run through m_defrag
+                        */
+                       MPASS(remap <= 1);
+                       if (__predict_false(m_head == NULL || remap > 1))
                                goto defrag_failed;
+                       remap++;
                        *m_headp = m_head;
                        goto retry;
                        break;
@@ -3871,7 +3898,7 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
        if (__predict_false((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || 
!LINK_ACTIVE(ctx))) {
                DBG_COUNTER_INC(tx_frees);
                m_freem(m);
-               return (ENOBUFS);
+               return (ENETDOWN);
        }
 
        MPASS(m->m_nextpkt == NULL);
@@ -4634,10 +4661,10 @@ iflib_pseudo_register(device_t dev, if_shared_ctx_t sc
         * XXX sanity check that ntxd & nrxd are a power of 2
         */
        iflib_reset_qvalues(ctx);
-
+       CTX_LOCK(ctx);
        if ((err = IFDI_ATTACH_PRE(ctx)) != 0) {
                device_printf(dev, "IFDI_ATTACH_PRE failed %d\n", err);
-               goto fail_ctx_free;
+               goto fail_unlock;
        }
        if (sctx->isc_flags & IFLIB_GEN_MAC)
                iflib_gen_mac(ctx);
@@ -4790,6 +4817,7 @@ iflib_pseudo_register(device_t dev, if_shared_ctx_t sc
        if_setgetcounterfn(ctx->ifc_ifp, iflib_if_get_counter);
        iflib_add_device_sysctl_post(ctx);
        ctx->ifc_flags |= IFC_INIT_DONE;
+       CTX_UNLOCK(ctx);
        return (0);
 fail_detach:
        ether_ifdetach(ctx->ifc_ifp);
@@ -4798,6 +4826,8 @@ fail_queues:
        iflib_rx_structures_free(ctx);
 fail_iflib_detach:
        IFDI_DETACH(ctx);
+fail_unlock:
+       CTX_UNLOCK(ctx);
 fail_ctx_free:
        free(ctx->ifc_softc, M_IFLIB);
        free(ctx, M_IFLIB);

Modified: stable/12/sys/net/iflib.h
==============================================================================
--- stable/12/sys/net/iflib.h   Wed Apr 17 22:45:19 2019        (r346336)
+++ stable/12/sys/net/iflib.h   Wed Apr 17 23:02:37 2019        (r346337)
@@ -381,6 +381,8 @@ void iflib_set_mac(if_ctx_t ctx, uint8_t mac[ETHER_ADD
 void iflib_request_reset(if_ctx_t ctx);
 uint8_t iflib_in_detach(if_ctx_t ctx);
 
+uint32_t iflib_get_rx_mbuf_sz(if_ctx_t ctx);
+
 /*
  * If the driver can plug cleanly in to newbus use these
  */

Modified: stable/12/sys/sys/param.h
==============================================================================
--- stable/12/sys/sys/param.h   Wed Apr 17 22:45:19 2019        (r346336)
+++ stable/12/sys/sys/param.h   Wed Apr 17 23:02:37 2019        (r346337)
@@ -60,7 +60,7 @@
  *             in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1200506      /* Master, propagated to newvers */
+#define __FreeBSD_version 1200507      /* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
_______________________________________________
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