summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_mbuf.c
diff options
context:
space:
mode:
authorandre <andre@FreeBSD.org>2005-11-04 17:20:53 +0000
committerandre <andre@FreeBSD.org>2005-11-04 17:20:53 +0000
commit438cb7bde701ce0b9a4dffe748bd0f98a9621770 (patch)
tree6fd7fe096545c90fb4216ae8f8172a94f08c19a3 /sys/kern/uipc_mbuf.c
parent1aceee70b0e0f10ab5c1556417c9a033f8342137 (diff)
downloadFreeBSD-src-438cb7bde701ce0b9a4dffe748bd0f98a9621770.zip
FreeBSD-src-438cb7bde701ce0b9a4dffe748bd0f98a9621770.tar.gz
Fix a logic error introduced with mandatory mbuf cluster refcounting and
freeing of mbufs+clusters back to the packet zone.
Diffstat (limited to 'sys/kern/uipc_mbuf.c')
-rw-r--r--sys/kern/uipc_mbuf.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c
index 9d90e01..4e0f2d9 100644
--- a/sys/kern/uipc_mbuf.c
+++ b/sys/kern/uipc_mbuf.c
@@ -215,9 +215,11 @@ mb_free_ext(struct mbuf *m)
/* 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) {
+ atomic_fetchadd_int(m->m_ext.ref_cnt, -1) == 0) {
switch (m->m_ext.ext_type) {
- case EXT_CLUSTER:
+ case EXT_CLUSTER: /* The packet zone is special. */
+ if (*(m->m_ext.ref_cnt) == 0)
+ *(m->m_ext.ref_cnt) = 1;
uma_zfree(zone_pack, m);
return; /* Job done. */
break;
OpenPOWER on IntegriCloud