Disallow allocating megablocks, update tests
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Wed, 10 Apr 2019 06:05:18 +0000 (09:05 +0300)
committerBen Gamari <ben@smart-cactus.org>
Wed, 19 Jun 2019 00:32:01 +0000 (20:32 -0400)
rts/sm/BlockAlloc.c
testsuite/tests/rts/testblockalloc.c

index b07a8c6..29890a4 100644 (file)
@@ -504,6 +504,12 @@ finish:
 bdescr *
 allocAlignedGroupOnNode (uint32_t node, W_ n)
 {
+    // To make sure we don't allocate megablocks in allocGroup below we need to
+    // check here that we ask for max BLOCKS_PER_MBLOCK/2 blocks.
+    if (2*n >= BLOCKS_PER_MBLOCK) {
+        barf("allocAlignedGroupOnNode: allocating more than a megablock: %" FMT_Word, 2*n);
+    }
+
     // allocate enough blocks to have enough space aligned at n-block boundary
     // free any slops on the low and high side of this space
 
@@ -511,10 +517,7 @@ allocAlignedGroupOnNode (uint32_t node, W_ n)
     uint32_t num_blocks = 2*n - 1;
     W_ group_size = n * BLOCK_SIZE;
 
-    // It's okay if we get a group larger than what we request; we will end up
-    // splitting it anyways. By using allocLargeChunk we reduce the potential
-    // for fragmentation.
-    bdescr *bd = allocLargeChunkOnNode(node, num_blocks, 3*n);
+    bdescr *bd = allocGroupOnNode(node, num_blocks);
 
     // slop on the low side
     W_ slop_low = 0;
index a48c20f..53eed24 100644 (file)
@@ -79,9 +79,12 @@ static void test_aligned_alloc(void)
     {
         for (int j=0; j < ARRSIZE; j++)
         {
-            int b = (rand() % MAXALLOC) + 1;
+            // allocAlignedGroupOnNode does not support allocating more than
+            // BLOCKS_PER_MBLOCK/2 blocks.
+            int b = rand() % (BLOCKS_PER_MBLOCK / 2);
+            if (b == 0) { b = 1; }
             a[j] = allocAlignedGroupOnNode(0, b);
-            if ((uintptr_t) a[j]->start % b != 0)
+            if ((((W_)(a[j]->start)) % (b*BLOCK_SIZE)) != 0)
             {
                 barf("%p is not aligned to allocation size %d", a[j], b);
             }