aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
authorPatrick Kelsey <pkelsey@FreeBSD.org>2020-03-14 19:56:46 +0000
committerPatrick Kelsey <pkelsey@FreeBSD.org>2020-03-14 19:56:46 +0000
commitb38136097ab216639bf9a0a68bca013df1afa9ce (patch)
tree71c40c86f8db7af46dbb83c2c1206eece34d0ffd /sys/net
parente5030490673f6077e8d44ef709bc8598c8843fdf (diff)
downloadsrc-b38136097ab216639bf9a0a68bca013df1afa9ce.tar.gz
src-b38136097ab216639bf9a0a68bca013df1afa9ce.zip
Allow iflib drivers to specify the buffer size used for each receive queue
Reviewed by: erj, gallatin MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D23947
Notes
Notes: svn path=/head/; revision=358998
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/iflib.c33
-rw-r--r--sys/net/iflib.h3
2 files changed, 31 insertions, 5 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 19b539b39051..4be7fa992c54 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -708,6 +708,7 @@ static int iflib_altq_if_transmit(if_t ifp, struct mbuf *m);
static int iflib_register(if_ctx_t);
static void iflib_deregister(if_ctx_t);
static void iflib_unregister_vlan_handlers(if_ctx_t ctx);
+static uint16_t iflib_get_mbuf_size_for(unsigned int size);
static void iflib_init_locked(if_ctx_t ctx);
static void iflib_add_device_sysctl_pre(if_ctx_t ctx);
static void iflib_add_device_sysctl_post(if_ctx_t ctx);
@@ -2163,6 +2164,8 @@ 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 scctx = &ctx->ifc_softc_ctx;
+ int qidx;
bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1);
/*
@@ -2171,7 +2174,16 @@ iflib_fl_setup(iflib_fl_t fl)
iflib_fl_bufs_free(fl);
/* Now replenish the mbufs */
MPASS(fl->ifl_credits == 0);
- fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz;
+ qidx = rxq->ifr_fl_offset + fl->ifl_id;
+ if (scctx->isc_rxd_buf_size[qidx] != 0)
+ fl->ifl_buf_size = scctx->isc_rxd_buf_size[qidx];
+ else
+ fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz;
+ /*
+ * ifl_buf_size may be a driver-supplied value, so pull it up
+ * to the selected mbuf size.
+ */
+ fl->ifl_buf_size = iflib_get_mbuf_size_for(fl->ifl_buf_size);
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);
@@ -2303,6 +2315,16 @@ iflib_timer(void *arg)
STATE_UNLOCK(ctx);
}
+static uint16_t
+iflib_get_mbuf_size_for(unsigned int size)
+{
+
+ if (size <= MCLBYTES)
+ return (MCLBYTES);
+ else
+ return (MJUMPAGESIZE);
+}
+
static void
iflib_calc_rx_mbuf_sz(if_ctx_t ctx)
{
@@ -2312,10 +2334,8 @@ iflib_calc_rx_mbuf_sz(if_ctx_t 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;
+ ctx->ifc_rx_mbuf_sz =
+ iflib_get_mbuf_size_for(sctx->isc_max_frame_size);
}
uint32_t
@@ -6724,6 +6744,9 @@ iflib_add_device_sysctl_post(if_ctx_t ctx)
SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "credits",
CTLFLAG_RD,
&fl->ifl_credits, 1, "credits available");
+ SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "buf_size",
+ CTLFLAG_RD,
+ &fl->ifl_buf_size, 1, "buffer size");
#if MEMORY_LOGGING
SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_m_enqueued",
CTLFLAG_RD,
diff --git a/sys/net/iflib.h b/sys/net/iflib.h
index 2b33e200cee7..c538fd768615 100644
--- a/sys/net/iflib.h
+++ b/sys/net/iflib.h
@@ -220,6 +220,9 @@ typedef struct if_softc_ctx {
uint32_t __spare2__;
iflib_intr_mode_t isc_intr;
+ uint16_t isc_rxd_buf_size[8]; /* set at init time by driver, 0
+ means use iflib-calculated size
+ based on isc_max_frame_size */
uint16_t isc_max_frame_size; /* set at init time by driver */
uint16_t isc_min_frame_size; /* set at init time by driver, only used if
IFLIB_NEED_ETHER_PAD is set. */