svn commit: r254342 - in user/np/cxl_tuning/sys: kern sys
Navdeep Parhar
np at FreeBSD.org
Wed Aug 14 23:36:34 UTC 2013
Author: np
Date: Wed Aug 14 23:36:33 2013
New Revision: 254342
URL: http://svnweb.freebsd.org/changeset/base/254342
Log:
Perform lazy initialization of a cluster's refcount if possible. This
doesn't change anything for the common cases where the constructor is
given an mbuf to attach to the cluster, or when the cluster is obtained
with m_cljget(NULL, ...) and attached later with m_cljset(). But it
allows for an alternate usage scenario where the cluster is managed
EXT_EXTREF style without ever having to look up its "usual" refcount via
uma_find_refcnt.
Modified:
user/np/cxl_tuning/sys/kern/kern_mbuf.c
user/np/cxl_tuning/sys/sys/mbuf.h
Modified: user/np/cxl_tuning/sys/kern/kern_mbuf.c
==============================================================================
--- user/np/cxl_tuning/sys/kern/kern_mbuf.c Wed Aug 14 22:55:05 2013 (r254341)
+++ user/np/cxl_tuning/sys/kern/kern_mbuf.c Wed Aug 14 23:36:33 2013 (r254342)
@@ -527,8 +527,6 @@ mb_dtor_pack(void *mem, int size, void *
static int
mb_ctor_clust(void *mem, int size, void *arg, int how)
{
- struct mbuf *m;
- u_int *refcnt;
int type;
uma_zone_t zone;
@@ -559,10 +557,11 @@ mb_ctor_clust(void *mem, int size, void
break;
}
- m = (struct mbuf *)arg;
- refcnt = uma_find_refcnt(zone, mem);
- *refcnt = 1;
- if (m != NULL) {
+ if (arg != NULL) {
+ struct mbuf *m = arg;
+ u_int *refcnt = uma_find_refcnt(zone, mem);
+
+ *refcnt = 1;
m->m_ext.ext_buf = (caddr_t)mem;
m->m_data = m->m_ext.ext_buf;
m->m_flags |= M_EXT;
@@ -572,6 +571,10 @@ mb_ctor_clust(void *mem, int size, void
m->m_ext.ext_size = size;
m->m_ext.ext_type = type;
m->m_ext.ref_cnt = refcnt;
+ } else {
+#ifdef INVARIANTS
+ *uma_find_refcnt(zone, mem) = 0;
+#endif
}
return (0);
Modified: user/np/cxl_tuning/sys/sys/mbuf.h
==============================================================================
--- user/np/cxl_tuning/sys/sys/mbuf.h Wed Aug 14 22:55:05 2013 (r254341)
+++ user/np/cxl_tuning/sys/sys/mbuf.h Wed Aug 14 23:36:33 2013 (r254342)
@@ -594,6 +594,7 @@ m_cljset(struct mbuf *m, void *cl, int t
m->m_ext.ext_size = size;
m->m_ext.ext_type = type;
m->m_ext.ref_cnt = uma_find_refcnt(zone, cl);
+ *m->m_ext.ref_cnt = 1;
m->m_flags |= M_EXT;
}
More information about the svn-src-user
mailing list