[PATCH v7 3/3] mbuf: optimize reset of reinitialized mbufs

Morten Brørup mb at smartsharesystems.com
Sat Aug 23 01:45:15 CEST 2025


An optimized function for resetting a bulk of newly allocated
reinitialized mbufs (a.k.a. raw mbufs) was added.

Compared to the normal packet mbuf reset function, it takes advantage of
the following two details:
1. The 'next' and 'nb_segs' fields are already reset, so resetting them
has been omitted.
2. When resetting the mbuf, the 'ol_flags' field must indicate whether the
mbuf uses an external buffer, and the 'data_off' field must not exceed the
data room size when resetting the data offset to include the default
headroom.
Unlike the normal packet mbuf reset function, which reads the mbuf itself
to get the information required for resetting these two fields, this
function gets the information from the mempool.

This makes the function write-only of the mbuf, unlike the normal packet
mbuf reset function, which is read-modify-write of the mbuf.

Signed-off-by: Morten Brørup <mb at smartsharesystems.com>
---
 lib/mbuf/rte_mbuf.h | 74 ++++++++++++++++++++++++++++-----------------
 1 file changed, 46 insertions(+), 28 deletions(-)

diff --git a/lib/mbuf/rte_mbuf.h b/lib/mbuf/rte_mbuf.h
index 49c93ab356..6f37a2e91e 100644
--- a/lib/mbuf/rte_mbuf.h
+++ b/lib/mbuf/rte_mbuf.h
@@ -954,6 +954,50 @@ static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf *m)
 					(uint16_t)m->buf_len);
 }
 
+/**
+ * Reset the fields of a bulk of packet mbufs to their default values.
+ *
+ * The caller must ensure that the mbufs come from the specified mempool,
+ * are direct and properly reinitialized (refcnt=1, next=NULL, nb_segs=1),
+ * as done by rte_pktmbuf_prefree_seg().
+ *
+ * This function should be used with care, when optimization is required.
+ * For standard needs, prefer rte_pktmbuf_reset().
+ *
+ * @param mp
+ *   The mempool to which the mbuf belongs.
+ * @param mbufs
+ *   Array of pointers to packet mbufs.
+ *   The array must not contain NULL pointers.
+ * @param count
+ *   Array size.
+ */
+static inline void
+rte_mbuf_raw_reset_bulk(struct rte_mempool *mp, struct rte_mbuf **mbufs, unsigned int count)
+{
+	uint64_t ol_flags = (rte_pktmbuf_priv_flags(mp) & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF) ?
+			RTE_MBUF_F_EXTERNAL : 0;
+	uint16_t data_off = RTE_MIN_T(RTE_PKTMBUF_HEADROOM, rte_pktmbuf_data_room_size(mp),
+			uint16_t);
+
+	for (unsigned int idx = 0; idx < count; idx++) {
+		struct rte_mbuf *m = mbufs[idx];
+
+		m->pkt_len = 0;
+		m->tx_offload = 0;
+		m->vlan_tci = 0;
+		m->vlan_tci_outer = 0;
+		m->port = RTE_MBUF_PORT_INVALID;
+
+		m->ol_flags = ol_flags;
+		m->packet_type = 0;
+		m->data_off = data_off;
+
+		m->data_len = 0;
+		__rte_mbuf_sanity_check(m, 1);
+	}
+}
+
 /**
  * Reset the fields of a packet mbuf to their default values.
  *
@@ -997,7 +1041,7 @@ static inline struct rte_mbuf *rte_pktmbuf_alloc(struct rte_mempool *mp)
 {
 	struct rte_mbuf *m;
 	if ((m = rte_mbuf_raw_alloc(mp)) != NULL)
-		rte_pktmbuf_reset(m);
+		rte_mbuf_raw_reset_bulk(mp, &m, 1);
 	return m;
 }
 
@@ -1018,38 +1062,12 @@ static inline struct rte_mbuf *rte_pktmbuf_alloc(struct rte_mempool *mp)
 static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool,
 	 struct rte_mbuf **mbufs, unsigned count)
 {
-	unsigned idx = 0;
 	int rc;
 
 	rc = rte_mbuf_raw_alloc_bulk(pool, (void **)mbufs, count);
 	if (unlikely(rc))
 		return rc;
-
-	/* To understand duff's device on loop unwinding optimization, see
-	 * https://en.wikipedia.org/wiki/Duff's_device.
-	 * Here while() loop is used rather than do() while{} to avoid extra
-	 * check if count is zero.
-	 */
-	switch (count % 4) {
-	case 0:
-		while (idx != count) {
-			rte_pktmbuf_reset(mbufs[idx]);
-			idx++;
-			/* fall-through */
-	case 3:
-			rte_pktmbuf_reset(mbufs[idx]);
-			idx++;
-			/* fall-through */
-	case 2:
-			rte_pktmbuf_reset(mbufs[idx]);
-			idx++;
-			/* fall-through */
-	case 1:
-			rte_pktmbuf_reset(mbufs[idx]);
-			idx++;
-			/* fall-through */
-		}
-	}
+	rte_mbuf_raw_reset_bulk(pool, mbufs, count);
 	return 0;
 }
 
-- 
2.43.0



More information about the dev mailing list