summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-16 00:14:38 -0500
committerBen Gamari <ben@smart-cactus.org>2022-12-21 15:46:41 -0500
commit7570ae43218fbdee30f783af5a3f49fa3d8301e3 (patch)
tree49ea2ce0125f85a8a9cf21eee2eab90a2bfbdf2b
parent2d10d8dfdff1212286490c2c19b8f725ce501b10 (diff)
downloadhaskell-7570ae43218fbdee30f783af5a3f49fa3d8301e3.tar.gz
nonmoving: Fix benign race in update remembered set check
Relaxed load is fine here since we will take the lock before looking at the list.
-rw-r--r--rts/sm/NonMovingMark.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c
index a0a86cdc07..a6ce3678bc 100644
--- a/rts/sm/NonMovingMark.c
+++ b/rts/sm/NonMovingMark.c
@@ -1774,7 +1774,9 @@ nonmovingMark (MarkQueue *queue)
}
case NULL_ENTRY:
// Perhaps the update remembered set has more to mark...
- if (upd_rem_set_block_list) {
+ // N.B. This must be atomic since we have not yet taken
+ // upd_rem_set_lock.
+ if (RELAXED_LOAD(&upd_rem_set_block_list) != NULL) {
ACQUIRE_LOCK(&upd_rem_set_lock);
bdescr *old = queue->blocks;
queue->blocks = upd_rem_set_block_list;