Only use mbuf headroom when mbuf->refcnt == 1,
indicating exclusive ownership. For shared mbufs (refcnt > 1),
use next desc instead to avoid data corruption.

This prevents modifying shared buffers that may be used by other
processing contexts.

Implementation details:
- Check mbuf->refcnt before using headroom
- For refcnt == 1: use existing headroom (performance optimal)
- For refcnt > 1: use next desc

Fixes: e5fc1f78c78c ("net/nbl: support Tx and Rx burst")
Cc: [email protected]

Signed-off-by: Dimon Zhao <[email protected]>
---
 drivers/net/nbl/nbl_hw/nbl_txrx.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/nbl/nbl_hw/nbl_txrx.c 
b/drivers/net/nbl/nbl_hw/nbl_txrx.c
index 563f011cd3..2a6acdcac1 100644
--- a/drivers/net/nbl/nbl_hw/nbl_txrx.c
+++ b/drivers/net/nbl/nbl_hw/nbl_txrx.c
@@ -505,7 +505,10 @@ nbl_res_txrx_xmit_pkts(void *tx_queue, struct rte_mbuf 
**tx_pkts, u16 nb_pkts, u
                        tx_extend_len = required_headroom + sizeof(struct 
rte_ether_hdr);
                }
 
-               if (rte_pktmbuf_headroom(tx_pkt) >= required_headroom) {
+               if (rte_mbuf_refcnt_read(tx_pkt) == 1 &&
+                   RTE_MBUF_DIRECT(tx_pkt) &&
+                   tx_pkt->nb_segs == 1 &&
+                   rte_pktmbuf_headroom(tx_pkt) >= required_headroom) {
                        can_push = 1;
                        u = rte_pktmbuf_mtod_offset(tx_pkt, union 
nbl_tx_extend_head *,
                                                    -required_headroom);
-- 
2.34.1

Reply via email to