From 7eccf2450dec4bb3ea00537ebf8771ec7d140f36 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 29 Jul 2004 08:46:23 +0000 Subject: [PATCH] Stage 1/many: mbuf/cluster accounting rewrite and mbuf allocator rewrite. 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. --- sys/dev/atm/en/midway.c | 4 +- sys/dev/netif/bge/if_bge.c | 8 +-- sys/dev/netif/lge/if_lge.c | 8 +-- sys/dev/netif/lnc/if_lnc.c | 4 +- sys/dev/netif/nge/if_nge.c | 8 +-- sys/dev/netif/sk/if_sk.c | 8 +-- sys/dev/netif/ti/if_ti.c | 8 +-- sys/dev/netif/wb/if_wb.c | 8 +-- sys/kern/uipc_mbuf.c | 114 ++++++++++++++++++--------------- sys/kern/uipc_mbuf2.c | 4 +- sys/kern/uipc_syscalls.c | 8 +-- sys/netinet6/ipsec.c | 4 +- sys/netproto/ipsec/key_debug.c | 6 +- sys/netproto/key/key_debug.c | 6 +- sys/sys/mbuf.h | 22 +++++-- 15 files changed, 119 insertions(+), 101 deletions(-) diff --git a/sys/dev/atm/en/midway.c b/sys/dev/atm/en/midway.c index 6a4b373119..45d28b09bc 100644 --- a/sys/dev/atm/en/midway.c +++ b/sys/dev/atm/en/midway.c @@ -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); diff --git a/sys/dev/netif/bge/if_bge.c b/sys/dev/netif/bge/if_bge.c index 63893b620c..5df8f2ec52 100644 --- a/sys/dev/netif/bge/if_bge.c +++ b/sys/dev/netif/bge/if_bge.c @@ -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; diff --git a/sys/dev/netif/lge/if_lge.c b/sys/dev/netif/lge/if_lge.c index a6faf2e3d5..df0c601940 100644 --- a/sys/dev/netif/lge/if_lge.c +++ b/sys/dev/netif/lge/if_lge.c @@ -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; diff --git a/sys/dev/netif/lnc/if_lnc.c b/sys/dev/netif/lnc/if_lnc.c index be8b7f8f36..d2764ae608 100644 --- a/sys/dev/netif/lnc/if_lnc.c +++ b/sys/dev/netif/lnc/if_lnc.c @@ -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); diff --git a/sys/dev/netif/nge/if_nge.c b/sys/dev/netif/nge/if_nge.c index 88e2b8e8dd..3acbf56529 100644 --- a/sys/dev/netif/nge/if_nge.c +++ b/sys/dev/netif/nge/if_nge.c @@ -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; diff --git a/sys/dev/netif/sk/if_sk.c b/sys/dev/netif/sk/if_sk.c index f56b569add..a5f0258785 100644 --- a/sys/dev/netif/sk/if_sk.c +++ b/sys/dev/netif/sk/if_sk.c @@ -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; diff --git a/sys/dev/netif/ti/if_ti.c b/sys/dev/netif/ti/if_ti.c index 727e4ac418..23454e3c16 100644 --- a/sys/dev/netif/ti/if_ti.c +++ b/sys/dev/netif/ti/if_ti.c @@ -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; diff --git a/sys/dev/netif/wb/if_wb.c b/sys/dev/netif/wb/if_wb.c index c4e4a2a4d3..64634989f1 100644 --- a/sys/dev/netif/wb/if_wb.c +++ b/sys/dev/netif/wb/if_wb.c @@ -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; diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index a71b5071d7..b4b8e68a74 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -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); } diff --git a/sys/kern/uipc_mbuf2.c b/sys/kern/uipc_mbuf2.c index bc42e2509b..668eeb8e0d 100644 --- a/sys/kern/uipc_mbuf2.c +++ b/sys/kern/uipc_mbuf2.c @@ -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"); diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 73b4fcfe36..8de664459c 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -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) { diff --git a/sys/netinet6/ipsec.c b/sys/netinet6/ipsec.c index 3f1abf1fdb..09286a6280 100644 --- a/sys/netinet6/ipsec.c +++ b/sys/netinet6/ipsec.c @@ -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 ) { diff --git a/sys/netproto/ipsec/key_debug.c b/sys/netproto/ipsec/key_debug.c index 134c49f8d8..c1867f667c 100644 --- a/sys/netproto/ipsec/key_debug.c +++ b/sys/netproto/ipsec/key_debug.c @@ -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; diff --git a/sys/netproto/key/key_debug.c b/sys/netproto/key/key_debug.c index 2dc5e80701..c17fc878a9 100644 --- a/sys/netproto/key/key_debug.c +++ b/sys/netproto/key/key_debug.c @@ -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; diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index 3f73327479..7705c0edad 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -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) ) -- 2.41.0