summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1996-08-19 03:32:10 +0000
committerjulian <julian@FreeBSD.org>1996-08-19 03:32:10 +0000
commit7017ff366e6e5f69dc6c791ad5341524a7686e6b (patch)
tree240fb1bcf8a31fbe4babb80ad7ed2636c272c8b7 /sys
parentdf9def6f62c391d351282ba6b34a350f072cab99 (diff)
downloadFreeBSD-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.c14
-rw-r--r--sys/sys/mbuf.h36
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.
OpenPOWER on IntegriCloud