Simplify block_alloc function
authorFergus Simpson <afergs@google.com>
Thu, 17 Nov 2016 17:35:33 +0000 (09:35 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 20 Nov 2016 20:55:11 +0000 (15:55 -0500)
Removed optimization from Plan 9 where the driver would attempt to make
use of extra memory reserved by malloc. Akaros does not currently have
the capability to get the real size of the reserved memory, so leaving
the optimization in just resulted in some complicated pointer arithmetic
that always yielded the defined constant Hdrspc.

The optimization has been left in comments in case Akaros ever gets the
ability to get the actual size of reserved memory.

Also added an assert that Hdrspc is aligned to BLOCKALIGN - if it were
not then Hdrspc would randomly be truncated by up to Hdrspc%BLOCKALIGN
bytes.

Change-Id: I5249df6fdd8f47f0f07b35fcf3f7fed45f61d383
Signed-off-by: Fergus Simpson <afergs@google.com>
[removed mlx4 references]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/allocb.c

index 1e91709..b46bbae 100644 (file)
@@ -59,6 +59,9 @@ struct block *block_alloc(size_t size, int mem_flags)
        uintptr_t addr;
        int n;
 
+       /* If Hdrspc is not block aligned it will cause issues. */
+       static_assert(Hdrspc % BLOCKALIGN == 0);
+
        b = kmalloc(sizeof(struct block) + size + Hdrspc + (BLOCKALIGN - 1),
                                mem_flags);
        if (b == NULL)
@@ -80,13 +83,21 @@ struct block *block_alloc(size_t size, int mem_flags)
         * the *real* size of the block we got. Very nice.
         * Not on akaros yet.
         b->lim = ((uint8_t*)b) + msize(b);
+        * See use of n in commented code below
         */
        b->lim =
                ((uint8_t *) b) + sizeof(struct block) + size + Hdrspc + (BLOCKALIGN -
                                                                                                                                  1);
        b->rp = b->base;
-       n = b->lim - b->base - size;
-       b->rp += n & ~(BLOCKALIGN - 1);
+       /* TODO: support this */
+       /* n is supposed to be Hdrspc + rear padding + extra reserved memory, but
+        * since we don't currently support checking how much memory was actually
+        * reserved, this is always Hdrspc + rear padding. After rounding that down
+        * to BLOCKALIGN, it's always Hdrpsc since the padding is < BLOCKALIGN.
+        n = b->lim - b->base - size;
+        b->rp += n & ~(BLOCKALIGN - 1);
+        */
+       b->rp += Hdrspc;
        b->wp = b->rp;
        /* b->base is aligned, rounded up from b
         * b->lim is the upper bound on our malloc