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 <[EMAIL PROTECTED]>                        <[EMAIL PROTECTED]>
      <http://www.Awfulhak.org>                   <[EMAIL PROTECTED]>
Don't _EVER_ lose your sense of humour !
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to