diff options
author | julian <julian@FreeBSD.org> | 1996-08-19 03:32:10 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1996-08-19 03:32:10 +0000 |
commit | 7017ff366e6e5f69dc6c791ad5341524a7686e6b (patch) | |
tree | 240fb1bcf8a31fbe4babb80ad7ed2636c272c8b7 /sys | |
parent | df9def6f62c391d351282ba6b34a350f072cab99 (diff) | |
download | FreeBSD-src-7017ff366e6e5f69dc6c791ad5341524a7686e6b.zip FreeBSD-src-7017ff366e6e5f69dc6c791ad5341524a7686e6b.tar.gz |
fix handling of external objects referenced by mbufs
somehow this got broken between 4.3 tahoe and here, though I've been using
these fixes for over a year here..
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/uipc_mbuf.c | 14 | ||||
-rw-r--r-- | sys/sys/mbuf.h | 36 |
2 files changed, 22 insertions, 28 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 0784592..edb63d4 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - * $Id: uipc_mbuf.c,v 1.22 1996/05/11 20:43:23 phk Exp $ + * $Id: uipc_mbuf.c,v 1.23 1996/05/12 07:48:47 phk Exp $ */ #include <sys/param.h> @@ -378,7 +378,11 @@ m_copym(m, off0, len, wait) n->m_len = min(len, m->m_len - off); if (m->m_flags & M_EXT) { n->m_data = m->m_data + off; - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; + if(!m->m_ext.ext_ref) + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; + else + (*(m->m_ext.ext_ref))(m->m_ext.ext_buf, + m->m_ext.ext_size); n->m_ext = m->m_ext; n->m_flags |= M_EXT; } else @@ -710,7 +714,11 @@ extpacket: if (m->m_flags & M_EXT) { n->m_flags |= M_EXT; n->m_ext = m->m_ext; - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; + if(!m->m_ext.ext_ref) + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; + else + (*(m->m_ext.ext_ref))(m->m_ext.ext_buf, + m->m_ext.ext_size); m->m_ext.ext_size = 0; /* For Accounting XXXXXX danger */ n->m_data = m->m_data + len; } else { diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index a00dcf4..5452570 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)mbuf.h 8.5 (Berkeley) 2/19/95 - * $Id: mbuf.h,v 1.15 1996/05/08 19:38:27 wollman Exp $ + * $Id: mbuf.h,v 1.16 1996/05/10 19:28:53 wollman Exp $ */ #ifndef _SYS_MBUF_H_ @@ -89,6 +89,8 @@ struct m_ext { void (*ext_free) /* free routine if not the usual */ __P((caddr_t, u_int)); u_int ext_size; /* size of buffer, for ext_free */ + void (*ext_ref) /* add a reference to the ext object */ + __P((caddr_t, u_int)); }; struct mbuf { @@ -247,6 +249,8 @@ union mcluster { 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; \ (m)->m_ext.ext_size = MCLBYTES; \ } \ } @@ -265,9 +269,9 @@ union mcluster { * Free a single mbuf and associated external storage. * Place the successor, if any, in n. */ -#ifdef notyet #define MFREE(m, n) \ - { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + MBUFLOCK( \ + mbstat.m_mtypes[(m)->m_type]--; \ if ((m)->m_flags & M_EXT) { \ if ((m)->m_ext.ext_free) \ (*((m)->m_ext.ext_free))((m)->m_ext.ext_buf, \ @@ -275,9 +279,10 @@ union mcluster { else { \ char *p = (m)->m_ext.ext_buf; \ if (--mclrefcnt[mtocl(p)] == 0) { \ - ((union mcluster *)(p))->mcl_next = mclfree; \ - mclfree = (union mcluster *)(p); \ - mbstat.m_clfree++; \ + ((union mcluster *)(p))->mcl_next = mclfree; \ + mclfree = (union mcluster *)(p); \ + mbstat.m_clfree++; \ + } \ } \ } \ (n) = (m)->m_next; \ @@ -285,26 +290,7 @@ union mcluster { mbstat.m_mtypes[MT_FREE]++; \ (m)->m_next = mmbfree; \ mmbfree = (m); \ - } -#else /* notyet */ -#define MFREE(m, nn) \ - MBUFLOCK ( \ - mbstat.m_mtypes[(m)->m_type]--; \ - if ((m)->m_flags & M_EXT) { \ - char *p = (m)->m_ext.ext_buf; \ - if (--mclrefcnt[mtocl(p)] == 0) { \ - ((union mcluster *)(p))->mcl_next = mclfree; \ - mclfree = (union mcluster *)(p); \ - mbstat.m_clfree++; \ - } \ - } \ - (nn) = (m)->m_next; \ - (m)->m_type = MT_FREE; \ - mbstat.m_mtypes[MT_FREE]++; \ - (m)->m_next = mmbfree; \ - mmbfree = (m); \ ) -#endif /* * Copy mbuf pkthdr from from to to. |