Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 2,072 Lines • ▼ Show 20 Lines | bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map, | ||||
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); | BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); | ||||
ctx->isc_rxd_flush(ctx->ifc_softc, fl->ifl_rxq->ifr_id, fl->ifl_id, pidx); | ctx->isc_rxd_flush(ctx->ifc_softc, fl->ifl_rxq->ifr_id, fl->ifl_id, pidx); | ||||
fl->ifl_fragidx = frag_idx; | fl->ifl_fragidx = frag_idx; | ||||
return (n == -1 ? 0 : IFLIB_RXEOF_EMPTY); | return (n == -1 ? 0 : IFLIB_RXEOF_EMPTY); | ||||
} | } | ||||
static __inline uint8_t | static __inline uint8_t | ||||
__iflib_fl_refill_lt(if_ctx_t ctx, iflib_fl_t fl, int max) | __iflib_fl_refill_all(if_ctx_t ctx, iflib_fl_t fl) | ||||
{ | { | ||||
/* we avoid allowing pidx to catch up with cidx as it confuses ixl */ | /* we avoid allowing pidx to catch up with cidx as it confuses ixl */ | ||||
int32_t reclaimable = fl->ifl_size - fl->ifl_credits - 1; | int32_t reclaimable = fl->ifl_size - fl->ifl_credits - 1; | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
int32_t delta = fl->ifl_size - get_inuse(fl->ifl_size, fl->ifl_cidx, fl->ifl_pidx, fl->ifl_gen) - 1; | int32_t delta = fl->ifl_size - get_inuse(fl->ifl_size, fl->ifl_cidx, fl->ifl_pidx, fl->ifl_gen) - 1; | ||||
#endif | #endif | ||||
MPASS(fl->ifl_credits <= fl->ifl_size); | MPASS(fl->ifl_credits <= fl->ifl_size); | ||||
MPASS(reclaimable == delta); | MPASS(reclaimable == delta); | ||||
if (reclaimable > 0) | if (reclaimable > 0) | ||||
return (_iflib_fl_refill(ctx, fl, min(max, reclaimable))); | return (_iflib_fl_refill(ctx, fl, reclaimable)); | ||||
return (0); | return (0); | ||||
} | } | ||||
uint8_t | uint8_t | ||||
iflib_in_detach(if_ctx_t ctx) | iflib_in_detach(if_ctx_t ctx) | ||||
{ | { | ||||
bool in_detach; | bool in_detach; | ||||
▲ Show 20 Lines • Show All 681 Lines • ▼ Show 20 Lines | iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) | ||||
MPASS(budget > 0); | MPASS(budget > 0); | ||||
rx_pkts = rx_bytes = 0; | rx_pkts = rx_bytes = 0; | ||||
if (sctx->isc_flags & IFLIB_HAS_RXCQ) | if (sctx->isc_flags & IFLIB_HAS_RXCQ) | ||||
cidxp = &rxq->ifr_cq_cidx; | cidxp = &rxq->ifr_cq_cidx; | ||||
else | else | ||||
cidxp = &rxq->ifr_fl[0].ifl_cidx; | cidxp = &rxq->ifr_fl[0].ifl_cidx; | ||||
if ((avail = iflib_rxd_avail(ctx, rxq, *cidxp, budget)) == 0) { | if ((avail = iflib_rxd_avail(ctx, rxq, *cidxp, budget)) == 0) { | ||||
for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) | for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) | ||||
retval |= __iflib_fl_refill_lt(ctx, fl, budget + 8); | retval |= __iflib_fl_refill_all(ctx, fl); | ||||
DBG_COUNTER_INC(rx_unavail); | DBG_COUNTER_INC(rx_unavail); | ||||
return (retval); | return (retval); | ||||
} | } | ||||
/* pfil needs the vnet to be set */ | /* pfil needs the vnet to be set */ | ||||
CURVNET_SET_QUIET(ifp->if_vnet); | CURVNET_SET_QUIET(ifp->if_vnet); | ||||
for (budget_left = budget; budget_left > 0 && avail > 0;) { | for (budget_left = budget; budget_left > 0 && avail > 0;) { | ||||
if (__predict_false(!CTX_ACTIVE(ctx))) { | if (__predict_false(!CTX_ACTIVE(ctx))) { | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | for (budget_left = budget; budget_left > 0 && avail > 0;) { | ||||
else { | else { | ||||
mt->m_nextpkt = m; | mt->m_nextpkt = m; | ||||
mt = m; | mt = m; | ||||
} | } | ||||
} | } | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
/* make sure that we can refill faster than drain */ | /* make sure that we can refill faster than drain */ | ||||
for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) | for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) | ||||
retval |= __iflib_fl_refill_lt(ctx, fl, budget + 8); | retval |= __iflib_fl_refill_all(ctx, fl); | ||||
lro_enabled = (if_getcapenable(ifp) & IFCAP_LRO); | lro_enabled = (if_getcapenable(ifp) & IFCAP_LRO); | ||||
if (lro_enabled) | if (lro_enabled) | ||||
iflib_get_ip_forwarding(&rxq->ifr_lc, &v4_forwarding, &v6_forwarding); | iflib_get_ip_forwarding(&rxq->ifr_lc, &v4_forwarding, &v6_forwarding); | ||||
mt = mf = NULL; | mt = mf = NULL; | ||||
while (mh != NULL) { | while (mh != NULL) { | ||||
m = mh; | m = mh; | ||||
mh = mh->m_nextpkt; | mh = mh->m_nextpkt; | ||||
▲ Show 20 Lines • Show All 4,006 Lines • Show Last 20 Lines |