summaryrefslogtreecommitdiff
path: root/rts/sm
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-12-03 14:30:41 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-12-05 16:07:49 -0500
commita7a4efbff1badf7daa41256cb506915e4fddee5c (patch)
treece9a6e94513ca6d6f7df6e891c70275e6e02f078 /rts/sm
parent70dd0e4b7051e674479729916285b12fc14c696f (diff)
downloadhaskell-a7a4efbff1badf7daa41256cb506915e4fddee5c.tar.gz
rts/NonMovingSweep: Fix locking of new mutable list allocation
Previously we used allocBlockOnNode_sync in nonmovingSweepMutLists despite the fact that we aren't in the GC and therefore the allocation spinlock isn't in use. This meant that sweep would end up spinning until the next minor GC, when the SM lock was moved away from the SM_MUTEX to the spinlock. This isn't a correctness issue but it sure isn't good for performance. Found thanks for Ward. Fixes #17539.
Diffstat (limited to 'rts/sm')
-rw-r--r--rts/sm/NonMovingSweep.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/rts/sm/NonMovingSweep.c b/rts/sm/NonMovingSweep.c
index 925d7c2068..44657148b8 100644
--- a/rts/sm/NonMovingSweep.c
+++ b/rts/sm/NonMovingSweep.c
@@ -281,7 +281,7 @@ void nonmovingSweepMutLists()
for (uint32_t n = 0; n < n_capabilities; n++) {
Capability *cap = capabilities[n];
bdescr *old_mut_list = cap->mut_lists[oldest_gen->no];
- cap->mut_lists[oldest_gen->no] = allocBlockOnNode_sync(cap->node);
+ cap->mut_lists[oldest_gen->no] = allocBlockOnNode_lock(cap->node);
for (bdescr *bd = old_mut_list; bd; bd = bd->link) {
for (StgPtr p = bd->start; p < bd->free; p++) {
StgClosure **q = (StgClosure**)p;