diff options
author | Ben Gamari <ben@smart-cactus.org> | 2019-04-14 12:26:57 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-10-22 12:18:39 -0400 |
commit | d15ac82dcaf1994a3027596e4c8c48fd300bb62d (patch) | |
tree | 0b0b522db5cfdf473b73c4f828821b955dd0ecdd | |
parent | 039d29068f0c0ae6ab133f5dac61948584335677 (diff) | |
download | haskell-d15ac82dcaf1994a3027596e4c8c48fd300bb62d.tar.gz |
NonMoving: Allocate mark queues in larger block groups
-rw-r--r-- | rts/sm/NonMovingMark.c | 6 | ||||
-rw-r--r-- | rts/sm/NonMovingMark.h | 5 |
2 files changed, 7 insertions, 4 deletions
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c index 1b71f52345..16693a710f 100644 --- a/rts/sm/NonMovingMark.c +++ b/rts/sm/NonMovingMark.c @@ -361,7 +361,7 @@ push (MarkQueue *q, const MarkQueueEnt *ent) } else { // allocate a fresh block. ACQUIRE_SM_LOCK; - bdescr *bd = allocGroup(1); + bdescr *bd = allocGroup(MARK_QUEUE_BLOCKS); bd->link = q->blocks; q->blocks = bd; q->top = (MarkQueueBlock *) bd->start; @@ -392,7 +392,7 @@ markQueuePushClosureGC (MarkQueue *q, StgClosure *p) // Yes, this block is full. // allocate a fresh block. ACQUIRE_SPIN_LOCK(&gc_alloc_block_sync); - bdescr *bd = allocGroup(1); + bdescr *bd = allocGroup(MARK_QUEUE_BLOCKS); bd->link = q->blocks; q->blocks = bd; q->top = (MarkQueueBlock *) bd->start; @@ -742,7 +742,7 @@ again: /* Must hold sm_mutex. */ static void init_mark_queue_ (MarkQueue *queue) { - bdescr *bd = allocGroup(1); + bdescr *bd = allocGroup(MARK_QUEUE_BLOCKS); queue->blocks = bd; queue->top = (MarkQueueBlock *) bd->start; queue->top->head = 0; diff --git a/rts/sm/NonMovingMark.h b/rts/sm/NonMovingMark.h index 7e9bfed1f9..a3629a2e99 100644 --- a/rts/sm/NonMovingMark.h +++ b/rts/sm/NonMovingMark.h @@ -93,8 +93,11 @@ typedef struct { MarkQueue queue; } UpdRemSet; +// Number of blocks to allocate for a mark queue +#define MARK_QUEUE_BLOCKS 16 + // The length of MarkQueueBlock.entries -#define MARK_QUEUE_BLOCK_ENTRIES ((BLOCK_SIZE - sizeof(MarkQueueBlock)) / sizeof(MarkQueueEnt)) +#define MARK_QUEUE_BLOCK_ENTRIES ((MARK_QUEUE_BLOCKS * BLOCK_SIZE - sizeof(MarkQueueBlock)) / sizeof(MarkQueueEnt)) extern bdescr *nonmoving_large_objects, *nonmoving_marked_large_objects; extern memcount n_nonmoving_large_blocks, n_nonmoving_marked_large_blocks; |