diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h --- a/sys/dev/cxgbe/adapter.h +++ b/sys/dev/cxgbe/adapter.h @@ -1404,7 +1404,6 @@ void t4_register_cpl_handler(int, cpl_handler_t); void t4_register_shared_cpl_handler(int, cpl_handler_t, int); #ifdef RATELIMIT -int ethofld_transmit(struct ifnet *, struct mbuf *); void send_etid_flush_wr(struct cxgbe_rate_tag *); #endif diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c --- a/sys/dev/cxgbe/t4_main.c +++ b/sys/dev/cxgbe/t4_main.c @@ -3062,16 +3062,16 @@ rc = parse_pkt(&m, vi->flags & TX_USES_VM_WR); if (__predict_false(rc != 0)) { + if (__predict_true(rc == EINPROGRESS)) { + /* queued by parse_pkt */ + MPASS(m != NULL); + return (0); + } + MPASS(m == NULL); /* was freed already */ atomic_add_int(&pi->tx_parse_error, 1); /* rare, atomic is ok */ return (rc); } -#ifdef RATELIMIT - if (m->m_pkthdr.csum_flags & CSUM_SND_TAG) { - if (m->m_pkthdr.snd_tag->sw->type == IF_SND_TAG_TYPE_RATE_LIMIT) - return (ethofld_transmit(ifp, m)); - } -#endif /* Select a txq. */ sc = vi->adapter; diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c --- a/sys/dev/cxgbe/t4_sge.c +++ b/sys/dev/cxgbe/t4_sge.c @@ -345,6 +345,7 @@ #endif static int ethofld_fw4_ack(struct sge_iq *, const struct rss_header *, struct mbuf *); +static int ethofld_transmit(struct ifnet *, struct mbuf *); #endif static counter_u64_t extfree_refs; @@ -2960,6 +2961,10 @@ set_mbuf_eo_nsegs(m0, nsegs); set_mbuf_eo_len16(m0, txpkt_eo_len16(nsegs, immhdrs, needs_tso(m0))); + rc = ethofld_transmit(mst->ifp, m0); + if (rc != 0) + goto fail; + return (EINPROGRESS); } #endif #endif @@ -6847,7 +6852,7 @@ } } -int +static int ethofld_transmit(struct ifnet *ifp, struct mbuf *m0) { struct cxgbe_rate_tag *cst; @@ -6903,8 +6908,6 @@ done: mtx_unlock(&cst->lock); - if (__predict_false(rc != 0)) - m_freem(m0); return (rc); }