Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jan 2006 14:29:02 +0100
From:      Andre Oppermann <andre@freebsd.org>
To:        JINMEI@freebsd.org
Cc:        freebsd-net@freebsd.org
Subject:   Re: m_tag leak?
Message-ID:  <43DF661E.8A08C7EF@freebsd.org>
References:  <y7vlkwweek0.wl%jinmei@isl.rdc.toshiba.co.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
JINMEI Tatuya / 神明達哉 wrote:
> 
> While tracking a different issue, I felt I just got confused.  From a
> very quick look at m_freem() and m_free(), it looks there is a leakage
> of m_tag.  This is the definition of m_freem() in rev. 1.160 of
> uipc_mbuf.c:
> 
> void
> m_freem(struct mbuf *mb)
> {
> 
>         while (mb != NULL)
>                 mb = m_free(mb);
> }
> 
> And the following is the definition of m_free() (defined in
> sys/mbuf.h, rev 1.187)
> 
> static __inline
> struct mbuf *
> m_free(struct mbuf *m)
> {
>         struct mbuf *n = m->m_next;
> 
>         if (m->m_flags & M_EXT)
>                 mb_free_ext(m);
>         else
>                 uma_zfree(zone_mbuf, m);
>         return n;
> }
> 
> Doesn't this mean an m_tag attached to the mbuf to be freed, if any,
> will remain without any reference?  Perhaps I'm missing something very
> trivial.  It would be appreciated if someone could clarify that.

This is indeed non-obvious and scattered around but happens correctly.
Have a look at kern/kern_mbuf.c:mb_dtor_mbuf().

-- 
Andre



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?43DF661E.8A08C7EF>