Summary: I think line 294 in kern_malloc.c can be deleted, and a tiny
bit of memory might be saved. L294 is the first of two lines that look
like:

        offset = __VM_CACHELINE_ALIGN(offset);

I did a quick test to confirm it's okay to remove.

If you buy that, you can skip the rest of this email!


****

In more detail:

I can't see why line 294 is there. There's already code later in the
function to deal with the alignment issue, and it looks correct on its
own.

To test my theory, I deleted the line and added a bunch of kprintfs.
Result: no failed KKASSERTs, no crashes, and sometimes a malloc_slab
can store one more object than before.



****

In even more detail:

I booted a kernel with the following patch, which deletes line 294 and
adds a bunch of printfs. (The new function malloc_mgt_old_count is just
a copy of the old calculation, so I can show a comparison with
kprintf.)

Output of "dmesg|grep XXX" at bottom.

+static size_t malloc_mgt_old_count(size_t size)
+{
+       size_t offset;
+       size_t count;
+
+       /*
+        * Figure out the count by taking into account the size of the fobjs[]
+        * array by adding it to the object size.
+        */
+       offset = offsetof(struct kmalloc_slab, fobjs[0]);
+       offset = __VM_CACHELINE_ALIGN(offset);
+       count = (KMALLOC_SLAB_SIZE - offset) / (size + sizeof(void *));
+
+       /*
+        * However, the fobj[] array itself must be aligned, so we might
+        * have to reduce the count by 1.  (We can do this becaues 'size'
+        * is already aligned as well).
+        */
+       offset = offsetof(struct kmalloc_slab, fobjs[count]);
+       offset = __VM_CACHELINE_ALIGN(offset);
+
+       if (offset + size * count > KMALLOC_SLAB_SIZE) {
+               --count;
+               offset = offsetof(struct kmalloc_slab, fobjs[count]);
+               offset = __VM_CACHELINE_ALIGN(offset);
+               KKASSERT (offset + size * count <= KMALLOC_SLAB_SIZE);
+       }
+
+       return count;
+}
+
 void
 malloc_mgt_init(struct malloc_type *type __unused,
                struct kmalloc_mgt *mgt, size_t size)
 {
        size_t offset;
-       size_t count;
+       size_t count, old_count;
 
        bzero(mgt, sizeof(*mgt));
        spin_init(&mgt->spin, "kmmgt");
@@ -291,7 +322,7 @@ malloc_mgt_init(struct malloc_type *type __unused,
         * array by adding it to the object size.
         */
        offset = offsetof(struct kmalloc_slab, fobjs[0]);
-       offset = __VM_CACHELINE_ALIGN(offset);
+       kprintf("XXX malloc_mgt_init fobjs[0] offset %jx\n", (uintmax_t)offset);
        count = (KMALLOC_SLAB_SIZE - offset) / (size + sizeof(void *));
 
        /*
@@ -309,6 +340,13 @@ malloc_mgt_init(struct malloc_type *type __unused,
                KKASSERT (offset + size * count <= KMALLOC_SLAB_SIZE);
        }
 
+       old_count = malloc_mgt_old_count(size);
+        kprintf("XXX malloc_mgt_init count before %jx now %jx\n", old_count, 
count);
+       if (old_count != count) {
+         kprintf("XXX malloc_mgt_init count changed! offset + size * count = 
%jx\n",
+                 (uintmax_t)(offset + size * count));
+       }
+
        mgt->slab_offset = offset;
        mgt->slab_count  = count;
 }



Output of dmesg|grep xxx; note all numbers are hex.

XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 14d now 14d
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 14d now 14d
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 1ef now 1ef
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 1ef now 1ef
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 1ef now 1ef
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 1ef now 1ef
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 14d now 14d
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 14d now 14d
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 11e now 11e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before a8 now a8
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 18e now 18e
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000
XXX malloc_mgt_init fobjs[0] offset 160
XXX malloc_mgt_init count before 3c0 now 3c1
XXX malloc_mgt_init count changed! offset + size * count = 20000


-- 
James

Reply via email to