mbuf refcnt issue

Stephen Hemminger stephen at networkplumber.org
Wed Apr 9 18:24:18 CEST 2025


On Wed, 9 Apr 2025 04:46:09 +0000
"Lombardo, Ed" <Ed.Lombardo at netscout.com> wrote:

> Hi Stephen,
> I am looking a the rte_mbuf.h file for rte_pktmbuf_free() and it is not clear to me that it checks if the mbuf refcnt is 1 before decrementing it and allowing the mbuf and segments (if any) to be returned to free pool.
> 
> Could my application issue be I have tx threads that transmit packets and does rte_pktmbuf_free(), while one other thread will perform rte_pktmbuf_free() on the same mbuf?  I ensured I bump the mbuf refcnt to 2 before other threads can process the same mbuf.
> 
> Thanks,
> Ed

It doesn't need to check refcnt there. The check is done later (since mbuf can be multi segment).

rte_pktmbuf_free
 -> rte_pktmbuf_free_seg
    -> rte_pktmbuf_prefree_seg
		
static __rte_always_inline struct rte_mbuf *
rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
{
	__rte_mbuf_sanity_check(m, 0);

	if (likely(rte_mbuf_refcnt_read(m) == 1)) {
            normal fast path. breaks the chain.
	} else if (__rte_mbuf_refcnt_update(m, -1) == 0) {
            refcnt > 1 logic

Note, the refcnt doesn't always go to zero when the mbuf is put back in the pool.
The refcnt for a freed mbuf (in the pool) doesn't matter, it is free, it is dead.
The refcnt is reset to 1 when mbuf is extracted from the pool.





More information about the users mailing list