arena: use the entire imported span
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 Sep 2019 21:27:58 +0000 (17:27 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Oct 2019 21:11:11 +0000 (17:11 -0400)
The source arena will round up to its quantum.  However, we would only
know that we got 'import_size', but we might get far more than that from
the parent.  If we round-up in advance, we'll know how much we are
getting.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/arena.c

index 2c26ff3..267871f 100644 (file)
@@ -687,9 +687,14 @@ static bool get_more_resources(struct arena *arena, size_t size, int flags)
        void *span;
        size_t import_size;
 
-       /* MAX check, in case size << scale overflows */
-       import_size = MAX(size, size << arena->import_scale);
        if (arena->source) {
+               /* MAX check, in case size << scale overflows */
+               import_size = MAX(size, size << arena->import_scale);
+               /* The source will roundup to the nearest quantum.  We might as
+                * well do it now so that we know about the extra space.
+                * Otherwise we'd just waste the excess. */
+               import_size = MAX(import_size,
+                                 ROUNDUP(import_size, arena->source->quantum));
                span = arena->afunc(arena->source, import_size, flags);
                if (!span)
                        return FALSE;