From c00108fd67397129aaed54bbec1d64b7b0cd4259 Mon Sep 17 00:00:00 2001 From: kmacy Date: Sat, 6 Oct 2007 21:13:55 +0000 Subject: Allow drivers to free an mbuf without having the mbuf be touched if the driver has already freed any attached tags Approved by: re(gnn) --- sys/kern/kern_mbuf.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'sys/kern/kern_mbuf.c') diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c index 8023920..a5e1348 100644 --- a/sys/kern/kern_mbuf.c +++ b/sys/kern/kern_mbuf.c @@ -339,9 +339,12 @@ static void mb_dtor_mbuf(void *mem, int size, void *arg) { struct mbuf *m; + unsigned long flags; m = (struct mbuf *)mem; - if ((m->m_flags & M_PKTHDR) != 0) + flags = (unsigned long)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__)); #ifdef INVARIANTS @@ -527,7 +530,7 @@ mb_ctor_pack(void *mem, int size, void *arg, int how) m->m_len = 0; m->m_flags = (flags | M_EXT); m->m_type = type; - + if (flags & M_PKTHDR) { m->m_pkthdr.rcvif = NULL; m->m_pkthdr.len = 0; -- cgit v1.1