tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
minor bug in mbuf code
Following the code in m_freem, there are different code paths for when an mbuf
is using its own space vs. when it is using an external buffer.
For the code path for an mbuf using its own space, we get to MFREE in
sys/sys/mbuf.h. In this code, before returning the mbuf to the pool, m->m_type
is set to M_FREE.
For the code path for an mbuf using external space, m->m_type is not touched
when the mbuf is returned to the pool.
This is a minor problem in that there is no code that is checking that an
mbuf's m_type is M_FREE when it comes out of the pool, and the m_get family
does set this field.
However, for anyone doing debugging and looking at potentially hanging
pointers, it would be helpful if all mbufs that have been returned to the pool
to actually have m->m_type set to MT_FREE.
Would someone be willing to commit this very minor change to the repository?
-Bev
Author: Bev Schwartz <bschwart%bbn.com@localhost>
Date: Mon Sep 16 11:45:04 2013 -0400
mark mbuf associated w/ cluster MT_FREE when returned to pool
If an mbuf is *not* associated with an mbuf cluster, when it is
returned to a pool, it is marked "MT_FREE".
When an mbuf *is* associated with an mbuf cluster, it goes through
a different code path to be returned to the pool, and this different
code path doesn't mark the mbuf as type MT_FREE.
The reason for the different (and more complex) code path for
freeing mbufs when the mbuf is associated with a cluster is that
the mbuf that "owns" the cluster cannot be freed until there
are no more references to the cluster.
This bug doesn't affect the functionality of NetBSD as it is now,
but if ever some code checks that an mbuf coming out of the pool
is, in fact, type MT_FREE, there will be a problem. Better to
fix the problem and reduce future confusion.
diff --git a/netbsd/src/sys/kern/uipc_mbuf.c b/netbsd/src/sys/kern/uipc_mbuf.c
index 84ffe60..542347a 100644
--- a/netbsd/src/sys/kern/uipc_mbuf.c
+++ b/netbsd/src/sys/kern/uipc_mbuf.c
@@ -1646,6 +1646,7 @@ m_ext_free(struct mbuf *m)
}
}
if (dofree) {
+ m->m_type = MT_FREE;
pool_cache_put(mb_cache, m);
}
}
Home |
Main Index |
Thread Index |
Old Index