summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-04-14 12:26:57 -0400
committerBen Gamari <ben@smart-cactus.org>2019-10-22 12:18:39 -0400
commitd15ac82dcaf1994a3027596e4c8c48fd300bb62d (patch)
tree0b0b522db5cfdf473b73c4f828821b955dd0ecdd
parent039d29068f0c0ae6ab133f5dac61948584335677 (diff)
downloadhaskell-d15ac82dcaf1994a3027596e4c8c48fd300bb62d.tar.gz
NonMoving: Allocate mark queues in larger block groups
-rw-r--r--rts/sm/NonMovingMark.c6
-rw-r--r--rts/sm/NonMovingMark.h5
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;