Index: sys/net/iflib.c =================================================================== --- sys/net/iflib.c +++ sys/net/iflib.c @@ -195,6 +195,7 @@ uint16_t ifc_sysctl_core_offset; #define CORE_OFFSET_UNSPECIFIED 0xffff uint8_t ifc_sysctl_separate_txrx; + uint8_t ifc_sysctl_limit_rx_refill; qidx_t ifc_sysctl_ntxds[8]; qidx_t ifc_sysctl_nrxds[8]; @@ -2090,7 +2091,9 @@ MPASS(reclaimable == delta); if (reclaimable > 0) - return (_iflib_fl_refill(ctx, fl, min(max, reclaimable))); + return (_iflib_fl_refill(ctx, fl, + ctx->ifc_sysctl_limit_rx_refill ? min(max, reclaimable) : + reclaimable)); return (0); } @@ -6539,6 +6542,9 @@ struct sysctl_ctx_list *ctx_list; struct sysctl_oid *node; + /* Default to legacy refill behavior. */ + ctx->ifc_sysctl_limit_rx_refill = 1; + ctx_list = device_get_sysctl_ctx(dev); child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev)); ctx->ifc_sysctl_node = node = SYSCTL_ADD_NODE(ctx_list, child, OID_AUTO, "iflib", @@ -6574,6 +6580,9 @@ SYSCTL_ADD_U8(ctx_list, oid_list, OID_AUTO, "separate_txrx", CTLFLAG_RDTUN, &ctx->ifc_sysctl_separate_txrx, 0, "use separate cores for TX and RX"); + SYSCTL_ADD_U8(ctx_list, oid_list, OID_AUTO, "limit_rx_refill", + CTLFLAG_RW, &ctx->ifc_sysctl_limit_rx_refill, 0, + "limit RX descriptor refill to rx_budget + 8 per RX interrupt"); /* XXX change for per-queue sizes */ SYSCTL_ADD_PROC(ctx_list, oid_list, OID_AUTO, "override_ntxds",