git: 8afd23de9276 - main - cxgbe: Allow parse_pkt to internally queue a packet.

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 17 Feb 2023 17:08:16 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=8afd23de92768ed4c80f0c3913bf30f72635d13d

commit 8afd23de92768ed4c80f0c3913bf30f72635d13d
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2023-02-17 17:03:23 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2023-02-17 17:03:23 +0000

    cxgbe: Allow parse_pkt to internally queue a packet.
    
    If parse_pkt returns EINPROGRESS, return from cxgbe_transmit
    without queueing the packet in a txq.  Use this to move the call
    to ethofld_transmit for packet pacing into parse_pkt.
    
    Reviewed by:    np
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D38577
---
 sys/dev/cxgbe/adapter.h |  1 -
 sys/dev/cxgbe/t4_main.c | 12 ++++++------
 sys/dev/cxgbe/t4_sge.c  |  9 ++++++---
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h
index 5460462c5f51..b470d1a6461c 100644
--- a/sys/dev/cxgbe/adapter.h
+++ b/sys/dev/cxgbe/adapter.h
@@ -1404,7 +1404,6 @@ void t4_register_fw_msg_handler(int, fw_msg_handler_t);
 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
index 33d372f575d0..71ee366e04e0 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -3062,16 +3062,16 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m)
 
 	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
index 88a7f44cadb7..ad3cb63dade4 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -345,6 +345,7 @@ static inline u_int txpkt_eo_len16(u_int, u_int, u_int);
 #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 @@ restart:
 		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 @@ ethofld_tx(struct cxgbe_rate_tag *cst)
 	}
 }
 
-int
+static int
 ethofld_transmit(struct ifnet *ifp, struct mbuf *m0)
 {
 	struct cxgbe_rate_tag *cst;
@@ -6903,8 +6908,6 @@ ethofld_transmit(struct ifnet *ifp, struct mbuf *m0)
 
 done:
 	mtx_unlock(&cst->lock);
-	if (__predict_false(rc != 0))
-		m_freem(m0);
 	return (rc);
 }