m_tag leak?
Andre Oppermann
andre at freebsd.org
Tue Jan 31 05:28:46 PST 2006
JINMEI Tatuya / $B?@L at C#:H(B 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
More information about the freebsd-net
mailing list