Allow allocating megablocks in allocAlignedGroupOnNode
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Mon, 10 Jun 2019 07:42:41 +0000 (10:42 +0300)
committerBen Gamari <ben@smart-cactus.org>
Wed, 19 Jun 2019 00:32:01 +0000 (20:32 -0400)
This is currently broken because freeGroup assumes integral number of
megablocks when freeing megablocks but we try to split the megablocks
returned by allocLargeChunkOnNode to smaller groups and free the rest.

rts/sm/BlockAlloc.c
testsuite/tests/rts/testblockalloc.c

index 841f34b..e668690 100644 (file)
@@ -504,12 +504,6 @@ 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 at most BLOCKS_PER_MBLOCK/4 blocks.
-    if (4*n > BLOCKS_PER_MBLOCK) {
-        barf("allocAlignedGroupOnNode: allocating more than a megablock: %" FMT_Word, 4*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
 
@@ -518,9 +512,8 @@ allocAlignedGroupOnNode (uint32_t node, W_ n)
     W_ group_size = n * BLOCK_SIZE;
 
     // To reduce splitting and fragmentation we use allocLargeChunkOnNode here.
-    // `max` parameter is `BLOCKS_PER_MBLOCK / 2` to avoid allocating
-    // megablocks while checking all free lists.
-    bdescr *bd = allocLargeChunkOnNode(node, num_blocks, BLOCKS_PER_MBLOCK / 2);
+    bdescr *bd = allocLargeChunkOnNode(node, num_blocks, num_blocks*3);
+
     // We may allocate more than num_blocks, so update it
     num_blocks = bd->blocks;
 
index 6e6f855..fabfafd 100644 (file)
@@ -79,9 +79,7 @@ static void test_aligned_alloc(void)
     {
         for (int j=0; j < ARRSIZE; j++)
         {
-            // allocAlignedGroupOnNode does not support allocating more than
-            // BLOCKS_PER_MBLOCK/2 blocks.
-            int b = rand() % (BLOCKS_PER_MBLOCK / 4);
+            int b = (rand() % MAXALLOC) + 1;
             if (b == 0) { b = 1; }
             a[j] = allocAlignedGroupOnNode(0, b);
             if ((((W_)(a[j]->start)) % (b*BLOCK_SIZE)) != 0)