Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 2,025 Lines • ▼ Show 20 Lines | #endif | ||||
if (i) { | if (i) { | ||||
iru.iru_pidx = pidx; | iru.iru_pidx = pidx; | ||||
iru.iru_count = i; | iru.iru_count = i; | ||||
ctx->isc_rxd_refill(ctx->ifc_softc, &iru); | ctx->isc_rxd_refill(ctx->ifc_softc, &iru); | ||||
fl->ifl_pidx = idx; | fl->ifl_pidx = idx; | ||||
fl->ifl_credits = credits; | fl->ifl_credits = credits; | ||||
} | } | ||||
if (__predict_false(n != -1)) { | |||||
/* don't flush */ | |||||
return (IFLIB_RXEOF_EMPTY); | |||||
} | |||||
DBG_COUNTER_INC(rxd_flush); | DBG_COUNTER_INC(rxd_flush); | ||||
if (fl->ifl_pidx == 0) | if (fl->ifl_pidx == 0) | ||||
pidx = fl->ifl_size - 1; | pidx = fl->ifl_size - 1; | ||||
else | else | ||||
pidx = fl->ifl_pidx - 1; | pidx = fl->ifl_pidx - 1; | ||||
bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map, | 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 + 1; | fl->ifl_fragidx = frag_idx + 1; | ||||
if (fl->ifl_fragidx == fl->ifl_size) | if (fl->ifl_fragidx == fl->ifl_size) | ||||
fl->ifl_fragidx = 0; | fl->ifl_fragidx = 0; | ||||
return (n == -1 ? 0 : IFLIB_RXEOF_EMPTY); | return (0); | ||||
} | } | ||||
static __inline uint8_t | static __inline uint8_t | ||||
__iflib_fl_refill_all(if_ctx_t ctx, iflib_fl_t fl) | __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 | ||||
▲ Show 20 Lines • Show All 536 Lines • ▼ Show 20 Lines | assemble_segments(iflib_rxq_t rxq, if_rxd_info_t ri, if_rxsd_t sd, int *pf_rv) | ||||
mh = NULL; | mh = NULL; | ||||
consumed = false; | consumed = false; | ||||
*pf_rv = PFIL_PASS; | *pf_rv = PFIL_PASS; | ||||
pf_rv_ptr = pf_rv; | pf_rv_ptr = pf_rv; | ||||
do { | do { | ||||
m = rxd_frag_to_sd(rxq, &ri->iri_frags[i], !consumed, sd, | m = rxd_frag_to_sd(rxq, &ri->iri_frags[i], !consumed, sd, | ||||
pf_rv_ptr, ri); | pf_rv_ptr, ri); | ||||
MPASS(*sd->ifsd_cl != NULL); | MPASS(*sd->ifsd_cl != NULL); | ||||
hselasky: This is the assertion we hit! Can you explain why? | |||||
gallatinUnsubmitted Not Done Inline ActionsI wonder if it is a bug in the lower-level driver, and it is giving the hardware ring entries beyond pidx? Aside from that, I don't know. gallatin: I wonder if it is a bug in the lower-level driver, and it is giving the hardware ring entries… | |||||
/* | /* | ||||
* Exclude zero-length frags & frags from | * Exclude zero-length frags & frags from | ||||
* packets the filter has consumed or dropped | * packets the filter has consumed or dropped | ||||
*/ | */ | ||||
if (ri->iri_frags[i].irf_len == 0 || consumed || | if (ri->iri_frags[i].irf_len == 0 || consumed || | ||||
*pf_rv == PFIL_CONSUMED || *pf_rv == PFIL_DROPPED) { | *pf_rv == PFIL_CONSUMED || *pf_rv == PFIL_DROPPED) { | ||||
if (mh == NULL) { | if (mh == NULL) { | ||||
▲ Show 20 Lines • Show All 4,232 Lines • Show Last 20 Lines |
This is the assertion we hit! Can you explain why?