svn commit: r346337 - in stable/12/sys: dev/e1000 dev/ixgbe dev/ixl net sys
Eric Joyner
erj at FreeBSD.org
Wed Apr 17 23:02:40 UTC 2019
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,
More information about the svn-src-stable-12
mailing list