Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net/iflib.c
Show First 20 Lines • Show All 1,969 Lines • ▼ Show 20 Lines | while (n--) { | ||||
* If the cluster is still set then we know a minimum sized packet was received | * If the cluster is still set then we know a minimum sized packet was received | ||||
*/ | */ | ||||
bit_ffc_at(fl->ifl_rx_bitmap, frag_idx, fl->ifl_size, | bit_ffc_at(fl->ifl_rx_bitmap, frag_idx, fl->ifl_size, | ||||
&frag_idx); | &frag_idx); | ||||
if (frag_idx < 0) | if (frag_idx < 0) | ||||
bit_ffc(fl->ifl_rx_bitmap, fl->ifl_size, &frag_idx); | bit_ffc(fl->ifl_rx_bitmap, fl->ifl_size, &frag_idx); | ||||
MPASS(frag_idx >= 0); | MPASS(frag_idx >= 0); | ||||
if ((cl = sd_cl[frag_idx]) == NULL) { | if ((cl = sd_cl[frag_idx]) == NULL) { | ||||
if ((cl = m_cljget(NULL, M_NOWAIT, fl->ifl_buf_size)) == NULL) | cl = m_cljget(NULL, M_NOWAIT, fl->ifl_buf_size); | ||||
if (__predict_false(cl == NULL)) | |||||
break; | break; | ||||
cb_arg.error = 0; | cb_arg.error = 0; | ||||
MPASS(sd_map != NULL); | MPASS(sd_map != NULL); | ||||
err = bus_dmamap_load(fl->ifl_buf_tag, sd_map[frag_idx], | err = bus_dmamap_load(fl->ifl_buf_tag, sd_map[frag_idx], | ||||
cl, fl->ifl_buf_size, _rxq_refill_cb, &cb_arg, | cl, fl->ifl_buf_size, _rxq_refill_cb, &cb_arg, | ||||
BUS_DMA_NOWAIT); | BUS_DMA_NOWAIT); | ||||
if (err != 0 || cb_arg.error) { | if (__predict_false(err != 0 || cb_arg.error)) { | ||||
/* | |||||
* !zone_pack ? | |||||
*/ | |||||
if (fl->ifl_zone == zone_pack) | |||||
uma_zfree(fl->ifl_zone, cl); | uma_zfree(fl->ifl_zone, cl); | ||||
break; | break; | ||||
} | } | ||||
sd_ba[frag_idx] = bus_addr = cb_arg.seg.ds_addr; | sd_ba[frag_idx] = bus_addr = cb_arg.seg.ds_addr; | ||||
sd_cl[frag_idx] = cl; | sd_cl[frag_idx] = cl; | ||||
#if MEMORY_LOGGING | #if MEMORY_LOGGING | ||||
fl->ifl_cl_enqueued++; | fl->ifl_cl_enqueued++; | ||||
#endif | #endif | ||||
} else { | } else { | ||||
bus_addr = sd_ba[frag_idx]; | bus_addr = sd_ba[frag_idx]; | ||||
} | } | ||||
bus_dmamap_sync(fl->ifl_buf_tag, sd_map[frag_idx], | bus_dmamap_sync(fl->ifl_buf_tag, sd_map[frag_idx], | ||||
BUS_DMASYNC_PREREAD); | BUS_DMASYNC_PREREAD); | ||||
if (sd_m[frag_idx] == NULL) { | if (sd_m[frag_idx] == NULL) { | ||||
if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) { | m = m_gethdr(M_NOWAIT, MT_NOINIT); | ||||
if (__predict_false(m == NULL)) | |||||
break; | break; | ||||
} | |||||
sd_m[frag_idx] = m; | sd_m[frag_idx] = m; | ||||
} | } | ||||
bit_set(fl->ifl_rx_bitmap, frag_idx); | bit_set(fl->ifl_rx_bitmap, frag_idx); | ||||
#if MEMORY_LOGGING | #if MEMORY_LOGGING | ||||
fl->ifl_m_enqueued++; | fl->ifl_m_enqueued++; | ||||
#endif | #endif | ||||
DBG_COUNTER_INC(rx_allocs); | DBG_COUNTER_INC(rx_allocs); | ||||
Show All 13 Lines | if (n == 0 || i == IFLIB_MAX_RX_REFRESH) { | ||||
ctx->isc_rxd_refill(ctx->ifc_softc, &iru); | ctx->isc_rxd_refill(ctx->ifc_softc, &iru); | ||||
i = 0; | i = 0; | ||||
pidx = idx; | pidx = idx; | ||||
fl->ifl_pidx = idx; | fl->ifl_pidx = idx; | ||||
fl->ifl_credits = credits; | fl->ifl_credits = credits; | ||||
} | } | ||||
} | } | ||||
if (i) { | if (n < count - 1) { | ||||
if (i != 0) { | |||||
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; | ||||
} | } | ||||
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); | |||||
if (__predict_true(bit_test(fl->ifl_rx_bitmap, frag_idx))) { | |||||
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; | ||||
} else { | |||||
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_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 */ | ||||
▲ Show 20 Lines • Show All 4,816 Lines • Show Last 20 Lines |