Author: andre
Date: Wed Aug 21 18:12:04 2013
New Revision: 254605
URL: http://svnweb.freebsd.org/changeset/base/254605

Log:
  Revert r254520 and resurrect the M_NOFREE mbuf flag and functionality.
  
  Requested by: np, grehan

Modified:
  head/sys/kern/kern_mbuf.c
  head/sys/kern/uipc_mbuf.c
  head/sys/sys/mbuf.h

Modified: head/sys/kern/kern_mbuf.c
==============================================================================
--- head/sys/kern/kern_mbuf.c   Wed Aug 21 17:47:11 2013        (r254604)
+++ head/sys/kern/kern_mbuf.c   Wed Aug 21 18:12:04 2013        (r254605)
@@ -474,6 +474,7 @@ mb_dtor_mbuf(void *mem, int size, void *
        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

Modified: head/sys/kern/uipc_mbuf.c
==============================================================================
--- head/sys/kern/uipc_mbuf.c   Wed Aug 21 17:47:11 2013        (r254604)
+++ head/sys/kern/uipc_mbuf.c   Wed Aug 21 18:12:04 2013        (r254605)
@@ -278,10 +278,16 @@ m_extadd(struct mbuf *mb, caddr_t buf, u
 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);
        }
 }
 

Modified: head/sys/sys/mbuf.h
==============================================================================
--- head/sys/sys/mbuf.h Wed Aug 21 17:47:11 2013        (r254604)
+++ head/sys/sys/mbuf.h Wed Aug 21 18:12:04 2013        (r254605)
@@ -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);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to