summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-12-03 14:30:41 -0500
committerBen Gamari <ben@smart-cactus.org>2019-12-03 14:38:37 -0500
commitaf247ff861702869843e0d7d9a6b3523135734bb (patch)
tree696d01a0868dcac0411e4ad5d46880890df3744d
parent3a96a0b6db6a32457ae2f91bb711c2481c767656 (diff)
downloadhaskell-wip/T17539.tar.gz
rts/NonMovingSweep: Fix locking of new mutable list allocationwip/T17539
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.
-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 b390959612..ffc4ec42ce 100644
--- a/rts/sm/NonMovingSweep.c
+++ b/rts/sm/NonMovingSweep.c
@@ -280,7 +280,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;