Revert r254520 and resurrect the M_NOFREE mbuf flag and functionality.
Requested by: np, grehan
This commit is contained in:
parent
58d5d31b36
commit
d8dc6ade5b
@ -474,6 +474,7 @@ mb_dtor_mbuf(void *mem, int size, void *arg)
|
||||
if ((flags & MB_NOTAGS) == 0 && (m->m_flags & M_PKTHDR) != 0)
|
||||
m_tag_delete_chain(m, NULL);
|
||||
KASSERT((m->m_flags & M_EXT) == 0, ("%s: M_EXT set", __func__));
|
||||
KASSERT((m->m_flags & M_NOFREE) == 0, ("%s: M_NOFREE set", __func__));
|
||||
#ifdef INVARIANTS
|
||||
trash_dtor(mem, size, arg);
|
||||
#endif
|
||||
|
@ -278,10 +278,16 @@ m_extadd(struct mbuf *mb, caddr_t buf, u_int size,
|
||||
void
|
||||
mb_free_ext(struct mbuf *m)
|
||||
{
|
||||
int skipmbuf;
|
||||
|
||||
KASSERT((m->m_flags & M_EXT) == M_EXT, ("%s: M_EXT not set", __func__));
|
||||
KASSERT(m->m_ext.ref_cnt != NULL, ("%s: ref_cnt not set", __func__));
|
||||
|
||||
/*
|
||||
* check if the header is embedded in the cluster
|
||||
*/
|
||||
skipmbuf = (m->m_flags & M_NOFREE);
|
||||
|
||||
/* Free attached storage if this mbuf is the only reference to it. */
|
||||
if (*(m->m_ext.ref_cnt) == 1 ||
|
||||
atomic_fetchadd_int(m->m_ext.ref_cnt, -1) == 1) {
|
||||
@ -322,6 +328,8 @@ mb_free_ext(struct mbuf *m)
|
||||
("%s: unknown ext_type", __func__));
|
||||
}
|
||||
}
|
||||
if (skipmbuf)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Free this mbuf back to the mbuf zone with all m_ext
|
||||
@ -386,7 +394,7 @@ m_demote(struct mbuf *m0, int all)
|
||||
m_freem(m->m_nextpkt);
|
||||
m->m_nextpkt = NULL;
|
||||
}
|
||||
m->m_flags = m->m_flags & (M_EXT|M_RDONLY);
|
||||
m->m_flags = m->m_flags & (M_EXT|M_RDONLY|M_NOFREE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -191,6 +191,7 @@ struct mbuf {
|
||||
#define M_PROMISC 0x00000040 /* packet was not for us */
|
||||
#define M_VLANTAG 0x00000080 /* ether_vtag is valid */
|
||||
#define M_FLOWID 0x00000100 /* deprecated: flowid is valid */
|
||||
#define M_NOFREE 0x00000200 /* do not free mbuf, embedded in cluster */
|
||||
|
||||
#define M_PROTO1 0x00001000 /* protocol-specific */
|
||||
#define M_PROTO2 0x00002000 /* protocol-specific */
|
||||
@ -526,7 +527,7 @@ m_free(struct mbuf *m)
|
||||
|
||||
if (m->m_flags & M_EXT)
|
||||
mb_free_ext(m);
|
||||
else
|
||||
else if ((m->m_flags & M_NOFREE) == 0)
|
||||
uma_zfree(zone_mbuf, m);
|
||||
return (n);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user