Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Sep 2004 21:46:00 +0100
From:      Brian Somers <brian@Awfulhak.org>
To:        freebsd-net@FreeBSD.org
Subject:   uma_zcreate() call from kern_mbuf.c - bug?
Message-ID:  <20040909214600.12bb5fd5@dev.lan.Awfulhak.org>

next in thread | raw e-mail | index | archive | help
I'm a bit confused by this uma_zcreate() call in kern_mbuf.c:

        zone_mbuf = uma_zcreate("Mbuf", MSIZE, mb_ctor_mbuf, mb_dtor_mbuf,
            NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_MAXBUCKET);

Given that dtom() is defined as:

#define dtom(x)         ((struct mbuf *)((intptr_t)(x) & ~(MSIZE-1)))

shouldn't this mean that the uma_zcreate should be:

        zone_mbuf = uma_zcreate("Mbuf", MSIZE, mb_ctor_mbuf, mb_dtor_mbuf,
            NULL, NULL, MSIZE - 1, UMA_ZONE_MAXBUCKET);

Of course m_get() et. al. seem to manage to get MSIZE aligned pointers back
from uma_zalloc_arg(zone_mbuf...) anyway, but surely that's an implementation
side effect and the align argument should be corrected.

There should probably also be a KASSERT here to ensure that MSIZE is sane (and
to stop idiots like me from shooting themselves in the foot with ``options
MSIZE=320'').

Comments on this patch ?

Index: kern_mbuf.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_mbuf.c,v
retrieving revision 1.3
diff -u -r1.3 kern_mbuf.c
--- kern_mbuf.c	2 Aug 2004 00:18:35 -0000	1.3
+++ kern_mbuf.c	9 Sep 2004 20:24:46 -0000
@@ -131,11 +131,15 @@
 mbuf_init(void *dummy)
 {
 
+	/* Ensure that MSIZE doesn't break dtom() */
+	KASSERT((((MSIZE - 1) ^ MSIZE) + 1) >> 1 == MSIZE,
+	    ("Invalid MSIZE - must only have a single bit set"));
+
 	/*
 	 * Configure UMA zones for Mbufs, Clusters, and Packets.
 	 */
 	zone_mbuf = uma_zcreate("Mbuf", MSIZE, mb_ctor_mbuf, mb_dtor_mbuf,
-	    NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_MAXBUCKET);
+	    NULL, NULL, MSIZE - 1, UMA_ZONE_MAXBUCKET);
 	zone_clust = uma_zcreate("MbufClust", MCLBYTES, mb_ctor_clust,
 	    mb_dtor_clust, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_REFCNT);
 	if (nmbclusters > 0)


-- 
Brian <brian@Awfulhak.org>                        <brian@[uk.]FreeBSD.org>
      <http://www.Awfulhak.org>;                   <brian@[uk.]OpenBSD.org>
Don't _EVER_ lose your sense of humour !



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040909214600.12bb5fd5>