I'd like to merge r254342 from user/np/cxl_tuning to head if there are no objections.
http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/kern/kern_mbuf.c?r1=254334&r2=254342&diff_format=u http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/sys/mbuf.h?r1=254334&r2=254342&diff_format=u --------------------- 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. --------------------- Regards, Navdeep diff -r 9753d3e51363 -r c9388a59fba6 sys/kern/kern_mbuf.c --- a/sys/kern/kern_mbuf.c Thu Aug 29 11:16:04 2013 -0700 +++ b/sys/kern/kern_mbuf.c Thu Aug 29 11:16:04 2013 -0700 @@ -503,8 +503,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; @@ -535,10 +533,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; @@ -549,6 +548,10 @@ mb_ctor_clust(void *mem, int size, void m->m_ext.ext_type = type; m->m_ext.ext_flags = 0; m->m_ext.ref_cnt = refcnt; + } else { +#ifdef INVARIANTS + *uma_find_refcnt(zone, mem) = 0; +#endif } return (0); diff -r 9753d3e51363 -r c9388a59fba6 sys/sys/mbuf.h --- a/sys/sys/mbuf.h Thu Aug 29 11:16:04 2013 -0700 +++ b/sys/sys/mbuf.h Thu Aug 29 11:16:04 2013 -0700 @@ -721,6 +721,7 @@ m_cljset(struct mbuf *m, void *cl, int t m->m_ext.ext_type = type; m->m_ext.ext_flags = 0; m->m_ext.ref_cnt = uma_find_refcnt(zone, cl); + *m->m_ext.ref_cnt = 1; m->m_flags |= M_EXT; } _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"