Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 621 Lines • ▼ Show 20 Lines | SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_oactive, CTLFLAG_RD, | ||||
&iflib_txq_drain_oactive, 0, "# drain oactives"); | &iflib_txq_drain_oactive, 0, "# drain oactives"); | ||||
SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_notready, CTLFLAG_RD, | SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_notready, CTLFLAG_RD, | ||||
&iflib_txq_drain_notready, 0, "# drain notready"); | &iflib_txq_drain_notready, 0, "# drain notready"); | ||||
SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_encapfail, CTLFLAG_RD, | SYSCTL_INT(_net_iflib, OID_AUTO, txq_drain_encapfail, CTLFLAG_RD, | ||||
&iflib_txq_drain_encapfail, 0, "# drain encap fails"); | &iflib_txq_drain_encapfail, 0, "# drain encap fails"); | ||||
static int iflib_encap_load_mbuf_fail; | static int iflib_encap_load_mbuf_fail; | ||||
static int iflib_encap_pad_mbuf_fail; | |||||
static int iflib_encap_txq_avail_fail; | static int iflib_encap_txq_avail_fail; | ||||
static int iflib_encap_txd_encap_fail; | static int iflib_encap_txd_encap_fail; | ||||
SYSCTL_INT(_net_iflib, OID_AUTO, encap_load_mbuf_fail, CTLFLAG_RD, | SYSCTL_INT(_net_iflib, OID_AUTO, encap_load_mbuf_fail, CTLFLAG_RD, | ||||
&iflib_encap_load_mbuf_fail, 0, "# busdma load failures"); | &iflib_encap_load_mbuf_fail, 0, "# busdma load failures"); | ||||
SYSCTL_INT(_net_iflib, OID_AUTO, encap_pad_mbuf_fail, CTLFLAG_RD, | |||||
&iflib_encap_pad_mbuf_fail, 0, "# runt frame pad failures"); | |||||
SYSCTL_INT(_net_iflib, OID_AUTO, encap_txq_avail_fail, CTLFLAG_RD, | SYSCTL_INT(_net_iflib, OID_AUTO, encap_txq_avail_fail, CTLFLAG_RD, | ||||
&iflib_encap_txq_avail_fail, 0, "# txq avail failures"); | &iflib_encap_txq_avail_fail, 0, "# txq avail failures"); | ||||
SYSCTL_INT(_net_iflib, OID_AUTO, encap_txd_encap_fail, CTLFLAG_RD, | SYSCTL_INT(_net_iflib, OID_AUTO, encap_txd_encap_fail, CTLFLAG_RD, | ||||
&iflib_encap_txd_encap_fail, 0, "# driver encap failures"); | &iflib_encap_txd_encap_fail, 0, "# driver encap failures"); | ||||
static int iflib_task_fn_rxs; | static int iflib_task_fn_rxs; | ||||
static int iflib_rx_intr_enables; | static int iflib_rx_intr_enables; | ||||
static int iflib_fast_intrs; | static int iflib_fast_intrs; | ||||
Show All 36 Lines | |||||
#define DBG_COUNTER_INC(name) atomic_add_int(&(iflib_ ## name), 1) | #define DBG_COUNTER_INC(name) atomic_add_int(&(iflib_ ## name), 1) | ||||
static void | static void | ||||
iflib_debug_reset(void) | iflib_debug_reset(void) | ||||
{ | { | ||||
iflib_tx_seen = iflib_tx_sent = iflib_tx_encap = iflib_rx_allocs = | iflib_tx_seen = iflib_tx_sent = iflib_tx_encap = iflib_rx_allocs = | ||||
iflib_fl_refills = iflib_fl_refills_large = iflib_tx_frees = | iflib_fl_refills = iflib_fl_refills_large = iflib_tx_frees = | ||||
iflib_txq_drain_flushing = iflib_txq_drain_oactive = | iflib_txq_drain_flushing = iflib_txq_drain_oactive = | ||||
iflib_txq_drain_notready = iflib_txq_drain_encapfail = | iflib_txq_drain_notready = iflib_txq_drain_encapfail = | ||||
iflib_encap_load_mbuf_fail = iflib_encap_txq_avail_fail = | iflib_encap_load_mbuf_fail = iflib_encap_pad_mbuf_fail = | ||||
iflib_encap_txd_encap_fail = iflib_task_fn_rxs = iflib_rx_intr_enables = | iflib_encap_txq_avail_fail = iflib_encap_txd_encap_fail = | ||||
iflib_fast_intrs = iflib_intr_link = iflib_intr_msix = iflib_rx_unavail = | iflib_task_fn_rxs = iflib_rx_intr_enables = iflib_fast_intrs = | ||||
iflib_intr_link = iflib_intr_msix = iflib_rx_unavail = | |||||
iflib_rx_ctx_inactive = iflib_rx_zero_len = iflib_rx_if_input = | iflib_rx_ctx_inactive = iflib_rx_zero_len = iflib_rx_if_input = | ||||
iflib_rx_mbuf_null = iflib_rxd_flush = 0; | iflib_rx_mbuf_null = iflib_rxd_flush = 0; | ||||
} | } | ||||
#else | #else | ||||
#define DBG_COUNTER_INC(name) | #define DBG_COUNTER_INC(name) | ||||
static void iflib_debug_reset(void) {} | static void iflib_debug_reset(void) {} | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 2,395 Lines • ▼ Show 20 Lines | calc_next_txd(iflib_txq_t txq, int cidx, uint8_t qid) | ||||
if (__predict_false(size == 0)) | if (__predict_false(size == 0)) | ||||
return (start); | return (start); | ||||
cur = start + size*cidx; | cur = start + size*cidx; | ||||
end = start + size*ntxd; | end = start + size*ntxd; | ||||
next = CACHE_PTR_NEXT(cur); | next = CACHE_PTR_NEXT(cur); | ||||
return (next < end ? next : start); | return (next < end ? next : start); | ||||
} | } | ||||
/* | |||||
* Pad an mbuf to ensure a minimum ethernet frame size. | |||||
* min_frame_size is the frame size (less CRC) to pad the mbuf to | |||||
*/ | |||||
static __noinline int | |||||
iflib_ether_pad(device_t dev, struct mbuf *m_head, uint16_t min_frame_size) | |||||
{ | |||||
/* | |||||
* 18 is enough bytes to pad an ARP packet to 46 bytes, and | |||||
* and ARP message is the smallest common payload I can think of | |||||
*/ | |||||
static char pad[18]; /* just zeros */ | |||||
int n; | |||||
for (n = min_frame_size - m_head->m_pkthdr.len; | |||||
n > 0; n -= sizeof(pad)) | |||||
if (!m_append(m_head, min(n, sizeof(pad)), pad)) | |||||
break; | |||||
if (n > 0) { | |||||
m_freem(m_head); | |||||
device_printf(dev, "cannot pad short frame\n"); | |||||
DBG_COUNTER_INC(encap_pad_mbuf_fail); | |||||
return (ENOBUFS); | |||||
} | |||||
return 0; | |||||
} | |||||
static int | static int | ||||
iflib_encap(iflib_txq_t txq, struct mbuf **m_headp) | iflib_encap(iflib_txq_t txq, struct mbuf **m_headp) | ||||
{ | { | ||||
if_ctx_t ctx; | if_ctx_t ctx; | ||||
if_shared_ctx_t sctx; | if_shared_ctx_t sctx; | ||||
if_softc_ctx_t scctx; | if_softc_ctx_t scctx; | ||||
bus_dma_segment_t *segs; | bus_dma_segment_t *segs; | ||||
struct mbuf *m_head; | struct mbuf *m_head; | ||||
Show All 38 Lines | iflib_encap(iflib_txq_t txq, struct mbuf **m_headp) | ||||
if (m_head->m_pkthdr.csum_flags & CSUM_TSO) { | if (m_head->m_pkthdr.csum_flags & CSUM_TSO) { | ||||
desc_tag = txq->ift_tso_desc_tag; | desc_tag = txq->ift_tso_desc_tag; | ||||
max_segs = scctx->isc_tx_tso_segments_max; | max_segs = scctx->isc_tx_tso_segments_max; | ||||
} else { | } else { | ||||
desc_tag = txq->ift_desc_tag; | desc_tag = txq->ift_desc_tag; | ||||
max_segs = scctx->isc_tx_nsegments; | max_segs = scctx->isc_tx_nsegments; | ||||
} | } | ||||
m_head = *m_headp; | m_head = *m_headp; | ||||
if ((sctx->isc_flags & IFLIB_NEED_ETHER_PAD) && | |||||
__predict_false(m_head->m_pkthdr.len < scctx->isc_min_frame_size)) { | |||||
err = iflib_ether_pad(ctx->ifc_dev, m_head, scctx->isc_min_frame_size); | |||||
if (err) | |||||
return err; | |||||
} | |||||
pkt_info_zero(&pi); | pkt_info_zero(&pi); | ||||
pi.ipi_mflags = (m_head->m_flags & (M_VLANTAG|M_BCAST|M_MCAST)); | pi.ipi_mflags = (m_head->m_flags & (M_VLANTAG|M_BCAST|M_MCAST)); | ||||
pi.ipi_pidx = pidx; | pi.ipi_pidx = pidx; | ||||
pi.ipi_qsidx = txq->ift_id; | pi.ipi_qsidx = txq->ift_id; | ||||
pi.ipi_len = m_head->m_pkthdr.len; | pi.ipi_len = m_head->m_pkthdr.len; | ||||
pi.ipi_csum_flags = m_head->m_pkthdr.csum_flags; | pi.ipi_csum_flags = m_head->m_pkthdr.csum_flags; | ||||
pi.ipi_vtag = (m_head->m_flags & M_VLANTAG) ? m_head->m_pkthdr.ether_vtag : 0; | pi.ipi_vtag = (m_head->m_flags & M_VLANTAG) ? m_head->m_pkthdr.ether_vtag : 0; | ||||
▲ Show 20 Lines • Show All 2,623 Lines • Show Last 20 Lines |