Stage 1/many: mbuf/cluster accounting rewrite and mbuf allocator rewrite.
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 29 Jul 2004 08:46:23 +0000 (08:46 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 29 Jul 2004 08:46:23 +0000 (08:46 +0000)
Implement 'new' style mbuf m_ext buffers where the callbacks are called with
a custom argument instead of with (buf, size).  Old style m_ext buffers have
to jump through loops to properly track reference counters in a manner that
is tightly integrated with the old mbuf/cluster KVA allocation array.

The old clustering methodology is going to have to be converted to the new
methodology before we can rip out the old mbuf allocator, plus we want to
use the new mechanism anyway because it is a whole lot cleaner and because
it's easier to import driver code (aka NDIS) from FreeBSD-5 with the new
mechanism.

This commit still supports the old mechanism via M_EXT_OLD, and all
existing function-based M_EXT's have been converted to use M_EXT_OLD.  The
old mechanism (and M_EXT_OLD) will be removed in later stages.

15 files changed:
sys/dev/atm/en/midway.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/lge/if_lge.c
sys/dev/netif/lnc/if_lnc.c
sys/dev/netif/nge/if_nge.c
sys/dev/netif/sk/if_sk.c
sys/dev/netif/ti/if_ti.c
sys/dev/netif/wb/if_wb.c
sys/kern/uipc_mbuf.c
sys/kern/uipc_mbuf2.c
sys/kern/uipc_syscalls.c
sys/netinet6/ipsec.c
sys/netproto/ipsec/key_debug.c
sys/netproto/key/key_debug.c
sys/sys/mbuf.h

index 6a4b373..45d28b0 100644 (file)
@@ -33,7 +33,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/en/midway.c,v 1.19.2.1 2003/01/23 21:06:42 sam Exp $
- * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.11 2004/07/23 07:16:24 joerg Exp $
+ * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.12 2004/07/29 08:46:19 dillon Exp $
  */
 
 /*
@@ -1819,7 +1819,7 @@ STATIC int en_makeexclusive(sc, mm, prev)
     m = *mm;
     
     if (m->m_flags & M_EXT) {
-       if (m->m_ext.ext_free) {
+       if (m->m_ext.ext_nfree.any) {
            /* external buffer isn't an ordinary mbuf cluster! */
            printf("%s: mfix: special buffer! can't make a copy!\n",
                   sc->sc_dev.dv_xname);
index 63893b6..5df8f2e 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.29 2003/12/01 21:06:59 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.22 2004/07/23 07:16:24 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.23 2004/07/29 08:46:22 dillon Exp $
  *
  */
 
@@ -890,11 +890,11 @@ bge_newbuf_jumbo(sc, i, m)
 
                /* Attach the buffer to the mbuf. */
                m_new->m_data = m_new->m_ext.ext_buf = (void *)buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_len = m_new->m_pkthdr.len =
                    m_new->m_ext.ext_size = BGE_JUMBO_FRAMELEN;
-               m_new->m_ext.ext_free = bge_jfree;
-               m_new->m_ext.ext_ref = bge_jref;
+               m_new->m_ext.ext_nfree.old = bge_jfree;
+               m_new->m_ext.ext_nref.old = bge_jref;
        } else {
                m_new = m;
                m_new->m_data = m_new->m_ext.ext_buf;
index a6faf2e..df0c601 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lge/if_lge.c,v 1.5.2.2 2001/12/14 19:49:23 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.13 2004/07/23 07:16:27 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.14 2004/07/29 08:46:22 dillon Exp $
  *
  * $FreeBSD: src/sys/dev/lge/if_lge.c,v 1.5.2.2 2001/12/14 19:49:23 jlemon Exp $
  */
@@ -792,11 +792,11 @@ static int lge_newbuf(sc, c, m)
                }
                /* Attach the buffer to the mbuf */
                m_new->m_data = m_new->m_ext.ext_buf = (void *)buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_ext.ext_size = m_new->m_pkthdr.len =
                    m_new->m_len = LGE_MCLBYTES;
-               m_new->m_ext.ext_free = lge_jfree;
-               m_new->m_ext.ext_ref = lge_jref;
+               m_new->m_ext.ext_nfree.old = lge_jfree;
+               m_new->m_ext.ext_nref.old = lge_jref;
        } else {
                m_new = m;
                m_new->m_len = m_new->m_pkthdr.len = LGE_MCLBYTES;
index be8b7f8..d2764ae 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc.c,v 1.89 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/Attic/if_lnc.c,v 1.12 2004/07/23 07:16:27 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/Attic/if_lnc.c,v 1.13 2004/07/29 08:46:22 dillon Exp $
  */
 
 /*
@@ -1569,7 +1569,7 @@ mbuf_dump_chain(struct mbuf * m)
                                    (void *)m->M_dat.MH.MH_dat.MH_ext.ext_buf);
                                log(LOG_DEBUG,
                                    "M_dat.MH.MH_dat.MH_ext.ext_free %p\n",
-                                   (void *)m->M_dat.MH.MH_dat.MH_ext.ext_free);
+                                   (void *)m->M_dat.MH.MH_dat.MH_ext.ext_nfree.old);
                                log(LOG_DEBUG,
                                    "M_dat.MH.MH_dat.MH_ext.ext_size %d\n",
                                    m->M_dat.MH.MH_dat.MH_ext.ext_size);
index 88e2b8e..3acbf56 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/nge/if_nge.c,v 1.13.2.13 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.13 2004/07/23 07:16:27 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.14 2004/07/29 08:46:22 dillon Exp $
  *
  * $FreeBSD: src/sys/dev/nge/if_nge.c,v 1.13.2.13 2003/02/05 22:03:57 mbr Exp $
  */
@@ -1157,11 +1157,11 @@ static int nge_newbuf(sc, c, m)
                }
                /* Attach the buffer to the mbuf */
                m_new->m_data = m_new->m_ext.ext_buf = (void *)buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_ext.ext_size = m_new->m_pkthdr.len =
                    m_new->m_len = NGE_MCLBYTES;
-               m_new->m_ext.ext_free = nge_jfree;
-               m_new->m_ext.ext_ref = nge_jref;
+               m_new->m_ext.ext_nfree.old = nge_jfree;
+               m_new->m_ext.ext_nref.old = nge_jref;
        } else {
                m_new = m;
                m_new->m_len = m_new->m_pkthdr.len = NGE_MCLBYTES;
index f56b569..a5f0258 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sk.c,v 1.19.2.9 2003/03/05 18:42:34 njl Exp $
- * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.17 2004/07/23 07:16:28 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.18 2004/07/29 08:46:23 dillon Exp $
  *
  * $FreeBSD: src/sys/pci/if_sk.c,v 1.19.2.9 2003/03/05 18:42:34 njl Exp $
  */
@@ -964,11 +964,11 @@ static int sk_newbuf(sc_if, c, m)
 
                /* Attach the buffer to the mbuf */
                m_new->m_data = m_new->m_ext.ext_buf = (void *)buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_ext.ext_size = m_new->m_pkthdr.len =
                    m_new->m_len = SK_MCLBYTES;
-               m_new->m_ext.ext_free = sk_jfree;
-               m_new->m_ext.ext_ref = sk_jref;
+               m_new->m_ext.ext_nfree.old = sk_jfree;
+               m_new->m_ext.ext_nref.old = sk_jref;
        } else {
                /*
                 * We're re-using a previously allocated mbuf;
index 727e4ac..23454e3 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_ti.c,v 1.25.2.14 2002/02/15 04:20:20 silby Exp $
- * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.13 2004/07/23 07:16:29 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.14 2004/07/29 08:46:23 dillon Exp $
  *
  * $FreeBSD: src/sys/pci/if_ti.c,v 1.25.2.14 2002/02/15 04:20:20 silby Exp $
  */
@@ -876,11 +876,11 @@ static int ti_newbuf_jumbo(sc, i, m)
 
                /* Attach the buffer to the mbuf. */
                m_new->m_data = m_new->m_ext.ext_buf = (void *)buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_len = m_new->m_pkthdr.len =
                    m_new->m_ext.ext_size = TI_JUMBO_FRAMELEN;
-               m_new->m_ext.ext_free = ti_jfree;
-               m_new->m_ext.ext_ref = ti_jref;
+               m_new->m_ext.ext_nfree.old = ti_jfree;
+               m_new->m_ext.ext_nref.old = ti_jref;
        } else {
                m_new = m;
                m_new->m_data = m_new->m_ext.ext_buf;
index c4e4a2a..6463498 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_wb.c,v 1.26.2.6 2003/03/05 18:42:34 njl Exp $
- * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.12 2004/07/23 07:16:29 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.13 2004/07/29 08:46:23 dillon Exp $
  *
  * $FreeBSD: src/sys/pci/if_wb.c,v 1.26.2.6 2003/03/05 18:42:34 njl Exp $
  */
@@ -1093,11 +1093,11 @@ static int wb_newbuf(sc, c, m)
                        return(ENOBUFS);
 
                m_new->m_data = m_new->m_ext.ext_buf = c->wb_buf;
-               m_new->m_flags |= M_EXT;
+               m_new->m_flags |= M_EXT | M_EXT_OLD;
                m_new->m_ext.ext_size = m_new->m_pkthdr.len =
                    m_new->m_len = WB_BUFBYTES;
-               m_new->m_ext.ext_free = wb_bfree;
-               m_new->m_ext.ext_ref = wb_bfree;
+               m_new->m_ext.ext_nfree.old = wb_bfree;
+               m_new->m_ext.ext_nref.old = wb_bfree;
        } else {
                m_new = m;
                m_new->m_len = m_new->m_pkthdr.len = WB_BUFBYTES;
index a71b507..b4b8e68 100644 (file)
@@ -82,7 +82,7 @@
  *
  * @(#)uipc_mbuf.c     8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.51.2.24 2003/04/15 06:59:29 silby Exp $
- * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.21 2004/07/08 22:07:34 hsu Exp $
+ * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.22 2004/07/29 08:46:21 dillon Exp $
  */
 
 #include "opt_param.h"
@@ -822,8 +822,9 @@ m_mclget(struct mbuf *m, int how)
        if (m->m_ext.ext_buf != NULL) {
                m->m_data = m->m_ext.ext_buf;
                m->m_flags |= M_EXT;
-               m->m_ext.ext_free = NULL;
-               m->m_ext.ext_ref = NULL;
+               KKASSERT((m->m_flags & M_EXT_OLD) == 0);
+               m->m_ext.ext_nfree.any = NULL;
+               m->m_ext.ext_nref.any = NULL;
                m->m_ext.ext_size = MCLBYTES;
        }
 }
@@ -852,6 +853,52 @@ m_mclfree(caddr_t mp)
        splx(s);
 }
 
+/*
+ * Helper routines for M_EXT reference/free
+ */
+static __inline void
+m_extref(const struct mbuf *m)
+{
+       if (m->m_flags & M_EXT_OLD) {
+               if (m->m_ext.ext_nref.old == NULL) {
+                       atomic_add_char(&mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
+               } else {
+                       int s = splimp();
+                       (*m->m_ext.ext_nref.old)(m->m_ext.ext_buf, 
+                                               m->m_ext.ext_size);
+                       splx(s);
+               }
+       } else {
+               if (m->m_ext.ext_nref.new == NULL) {
+                       atomic_add_char(&mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
+               } else {
+                       int s = splimp();
+                       (*m->m_ext.ext_nref.new)(m->m_ext.ext_arg); 
+                       splx(s);
+               }
+       }
+}
+
+static __inline void
+m_extfree(struct mbuf *m)
+{
+       if (m->m_flags & M_EXT_OLD) {
+               if (m->m_ext.ext_nfree.old != NULL) {
+                       m->m_ext.ext_nfree.old(m->m_ext.ext_buf,
+                                               m->m_ext.ext_size);
+               } else {
+                       _m_mclfree(m->m_ext.ext_buf);
+               }
+       } else {
+               if (m->m_ext.ext_nfree.new != NULL) {
+                       m->m_ext.ext_nfree.new(m->m_ext.ext_arg);
+               } else {
+                       _m_mclfree(m->m_ext.ext_buf);
+               }
+       }
+}
+
+
 /*
  * m_free()
  *
@@ -874,11 +921,7 @@ m_free(struct mbuf *m)
        if ((m->m_flags & M_PKTHDR) != 0)
                m_tag_delete_chain(m, NULL);
        if (m->m_flags & M_EXT) {
-               if (m->m_ext.ext_free != NULL) {
-                       m->m_ext.ext_free(m->m_ext.ext_buf, m->m_ext.ext_size);
-               } else {
-                       _m_mclfree(m->m_ext.ext_buf); /* inlined */
-               }
+               m_extfree(m);
        }
        n = m->m_next;
        m->m_type = MT_FREE;
@@ -1001,21 +1044,13 @@ m_copym(const struct mbuf *m, int off0, int len, int wait)
                n->m_len = min(len, m->m_len - off);
                if (m->m_flags & M_EXT) {
                        n->m_data = m->m_data + off;
-                       if (m->m_ext.ext_ref == NULL) {
-                               atomic_add_char(
-                                   &mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
-                       } else {
-                               int s = splimp();
-
-                               (*m->m_ext.ext_ref)(m->m_ext.ext_buf,
-                                   m->m_ext.ext_size);
-                               splx(s);
-                       }
+                       m_extref(m);
                        n->m_ext = m->m_ext;
-                       n->m_flags |= M_EXT;
-               } else
+                       n->m_flags |= m->m_flags & (M_EXT | M_EXT_OLD);
+               } else {
                        bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t),
                            (unsigned)n->m_len);
+               }
                if (len != M_COPYALL)
                        len -= n->m_len;
                off = 0;
@@ -1055,17 +1090,9 @@ m_copypacket(struct mbuf *m, int how)
        n->m_len = m->m_len;
        if (m->m_flags & M_EXT) {
                n->m_data = m->m_data;
-               if (m->m_ext.ext_ref == NULL)
-                       atomic_add_char(&mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
-               else {
-                       int s = splimp();
-
-                       (*m->m_ext.ext_ref)(m->m_ext.ext_buf,
-                           m->m_ext.ext_size);
-                       splx(s);
-               }
+               m_extref(m);
                n->m_ext = m->m_ext;
-               n->m_flags |= M_EXT;
+               n->m_flags |= m->m_flags & (M_EXT | M_EXT_OLD);
        } else {
                n->m_data = n->m_pktdat + (m->m_data - m->m_pktdat );
                bcopy(mtod(m, char *), mtod(n, char *), n->m_len);
@@ -1083,18 +1110,9 @@ m_copypacket(struct mbuf *m, int how)
                n->m_len = m->m_len;
                if (m->m_flags & M_EXT) {
                        n->m_data = m->m_data;
-                       if (m->m_ext.ext_ref == NULL) {
-                               atomic_add_char(
-                                   &mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
-                       } else {
-                               int s = splimp();
-
-                               (*m->m_ext.ext_ref)(m->m_ext.ext_buf,
-                                   m->m_ext.ext_size);
-                               splx(s);
-                       }
+                       m_extref(m);
                        n->m_ext = m->m_ext;
-                       n->m_flags |= M_EXT;
+                       n->m_flags |= m->m_flags & (M_EXT | M_EXT_OLD);
                } else {
                        bcopy(mtod(m, char *), mtod(n, char *), n->m_len);
                }
@@ -1427,18 +1445,10 @@ m_split(struct mbuf *m0, int len0, int wait)
        }
 extpacket:
        if (m->m_flags & M_EXT) {
-               n->m_flags |= M_EXT;
-               n->m_ext = m->m_ext;
-               if (m->m_ext.ext_ref == NULL)
-                       atomic_add_char(&mclrefcnt[mtocl(m->m_ext.ext_buf)], 1);
-               else {
-                       int s = splimp();
-
-                       (*m->m_ext.ext_ref)(m->m_ext.ext_buf,
-                           m->m_ext.ext_size);
-                       splx(s);
-               }
                n->m_data = m->m_data + len;
+               m_extref(m);
+               n->m_ext = m->m_ext;
+               n->m_flags |= m->m_flags & (M_EXT | M_EXT_OLD);
        } else {
                bcopy(mtod(m, caddr_t) + len, mtod(n, caddr_t), remain);
        }
index bc42e25..668eeb8 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/kern/uipc_mbuf2.c,v 1.2.2.5 2003/01/23 21:06:44 sam Exp $     */
-/*     $DragonFly: src/sys/kern/uipc_mbuf2.c,v 1.6 2004/06/02 14:42:57 eirikn Exp $    */
+/*     $DragonFly: src/sys/kern/uipc_mbuf2.c,v 1.7 2004/07/29 08:46:21 dillon Exp $    */
 /*     $KAME: uipc_mbuf2.c,v 1.31 2001/11/28 11:08:53 itojun Exp $     */
 /*     $NetBSD: uipc_mbuf.c,v 1.40 1999/04/01 00:23:25 thorpej Exp $   */
 
@@ -78,7 +78,7 @@
 
 #define M_SHAREDCLUSTER(m) \
        (((m)->m_flags & M_EXT) != 0 && \
-        ((m)->m_ext.ext_free || mclrefcnt[mtocl((m)->m_ext.ext_buf)] > 1))
+        ((m)->m_ext.ext_nfree.any || mclrefcnt[mtocl((m)->m_ext.ext_buf)] > 1))
 
 MALLOC_DEFINE(M_PACKET_TAGS, "tag", "packet-attached information");
 
index 73b4fcf..8de6644 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)uipc_syscalls.c     8.4 (Berkeley) 2/21/94
  * $FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.65.2.17 2003/04/04 17:11:16 tegge Exp $
- * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.38 2004/06/06 05:59:44 hsu Exp $
+ * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.39 2004/07/29 08:46:21 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -1620,12 +1620,12 @@ retry_lookup:
                }
                ++sf->aux1;     /* wiring count */
                ++sf->aux2;     /* initial reference */
-               m->m_ext.ext_free = sf_buf_mext;
-               m->m_ext.ext_ref = sf_buf_mref;
+               m->m_ext.ext_nfree.old = sf_buf_mext;
+               m->m_ext.ext_nref.old = sf_buf_mref;
                m->m_ext.ext_buf = (void *)sf->kva;
                m->m_ext.ext_size = PAGE_SIZE;
                m->m_data = (char *) sf->kva + pgoff;
-               m->m_flags |= M_EXT;
+               m->m_flags |= M_EXT | M_EXT_OLD;
                m->m_pkthdr.len = m->m_len = xfsize;
 
                if (mheader != NULL) {
index 3f1abf1..09286a6 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/ipsec.c,v 1.3.2.12 2003/05/06 06:46:58 suz Exp $     */
-/*     $DragonFly: src/sys/netinet6/ipsec.c,v 1.7 2004/06/02 14:43:01 eirikn Exp $     */
+/*     $DragonFly: src/sys/netinet6/ipsec.c,v 1.8 2004/07/29 08:46:22 dillon Exp $     */
 /*     $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
 
 /*
@@ -3246,7 +3246,7 @@ ipsec_copypkt(struct mbuf *m)
                         * XXX: is this approach effective?
                         */
                        if (
-                               n->m_ext.ext_free ||
+                               n->m_ext.ext_nfree.any ||
                                mclrefcnt[mtocl(n->m_ext.ext_buf)] > 1
                            )
                        {
index 134c49f..c1867f6 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netipsec/key_debug.c,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $  */
-/*     $DragonFly: src/sys/netproto/ipsec/key_debug.c,v 1.4 2003/08/23 10:06:23 rob Exp $      */
+/*     $DragonFly: src/sys/netproto/ipsec/key_debug.c,v 1.5 2004/07/29 08:46:22 dillon Exp $   */
 /*     $KAME: key_debug.c,v 1.26 2001/06/27 10:46:50 sakane Exp $      */
 
 /*
@@ -643,8 +643,8 @@ kdebug_mbufhdr(m)
        if (m->m_flags & M_EXT) {
                printf("  m_ext{ ext_buf:%p ext_free:%p "
                       "ext_size:%u ext_ref:%p }\n",
-                       m->m_ext.ext_buf, m->m_ext.ext_free,
-                       m->m_ext.ext_size, m->m_ext.ext_ref);
+                       m->m_ext.ext_buf, m->m_ext.ext_nfree.any,
+                       m->m_ext.ext_size, m->m_ext.ext_nref.any);
        }
 
        return;
index 2dc5e80..c17fc87 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netkey/key_debug.c,v 1.10.2.5 2002/04/28 05:40:28 suz Exp $   */
-/*     $DragonFly: src/sys/netproto/key/key_debug.c,v 1.4 2003/08/23 10:06:24 rob Exp $        */
+/*     $DragonFly: src/sys/netproto/key/key_debug.c,v 1.5 2004/07/29 08:46:22 dillon Exp $     */
 /*     $KAME: key_debug.c,v 1.26 2001/06/27 10:46:50 sakane Exp $      */
 
 /*
@@ -643,8 +643,8 @@ kdebug_mbufhdr(m)
        if (m->m_flags & M_EXT) {
                printf("  m_ext{ ext_buf:%p ext_free:%p "
                       "ext_size:%u ext_ref:%p }\n",
-                       m->m_ext.ext_buf, m->m_ext.ext_free,
-                       m->m_ext.ext_size, m->m_ext.ext_ref);
+                       m->m_ext.ext_buf, m->m_ext.ext_nfree.any,
+                       m->m_ext.ext_size, m->m_ext.ext_nref.any);
        }
 
        return;
index 3f73327..7705c0e 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)mbuf.h      8.5 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/mbuf.h,v 1.44.2.17 2003/04/15 06:15:02 silby Exp $
- * $DragonFly: src/sys/sys/mbuf.h,v 1.12 2004/06/04 20:29:02 dillon Exp $
+ * $DragonFly: src/sys/sys/mbuf.h,v 1.13 2004/07/29 08:46:22 dillon Exp $
  */
 
 #ifndef _SYS_MBUF_H_
@@ -104,11 +104,18 @@ struct pkthdr {
  */
 struct m_ext {
        caddr_t ext_buf;                /* start of buffer */
-       void    (*ext_free)             /* free routine if not the usual */
-                   (caddr_t, u_int);
-       u_int   ext_size;               /* size of buffer, for ext_free */
-       void    (*ext_ref)              /* add a reference to the ext object */
-               (caddr_t, u_int);
+       union {
+           void (*old)(caddr_t, u_int);
+           void (*new)(void *arg);
+           void *any;
+       } ext_nfree;
+       u_int   ext_size;               /* size of buffer, for ext_nfree */
+       union {
+           void (*old)(caddr_t, u_int);
+           void (*new)(void *arg);
+           void *any;
+       } ext_nref;
+       void    *ext_arg;
 };
 
 /*
@@ -165,6 +172,7 @@ struct mbuf {
 #define        M_FRAG          0x0400  /* packet is a fragment of a larger packet */
 #define        M_FIRSTFRAG     0x0800  /* packet is first fragment */
 #define        M_LASTFRAG      0x1000  /* packet is last fragment */
+#define M_EXT_OLD      0x2000  /* new ext function format */
 
 /*
  * Flags copied when copying m_pkthdr.
@@ -373,7 +381,7 @@ union mcluster {
  * Check if we can write to an mbuf.
  */
 #define M_EXT_WRITABLE(m)      \
-    ((m)->m_ext.ext_free == NULL && mclrefcnt[mtocl((m)->m_ext.ext_buf)] == 1)
+    ((m)->m_ext.ext_nfree.any == NULL && mclrefcnt[mtocl((m)->m_ext.ext_buf)] == 1)
 
 #define M_WRITABLE(m) (!((m)->m_flags & M_EXT) || \
     M_EXT_WRITABLE(m) )