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