summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2023-04-27 07:45:13 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-05-09 18:41:14 -0400
commitb2cdb7dacc095142e29c0f28a956b7fa97cdb4b1 (patch)
tree30aab423cf7ec7adde72437e850e94a3e9248ac6 /rts
parent6738c01d6175c5701e5c53e2ae6716d1103f7355 (diff)
downloadhaskell-b2cdb7dacc095142e29c0f28a956b7fa97cdb4b1.tar.gz
nonmoving: Account for mutator allocations in bytes_allocated
Previously we failed to account direct mutator allocations into the nonmoving heap against the mutator's allocation limit and `cap->total_allocated`. This only manifests during CAF evaluation (since we allocate the CAF's blackhole directly into the nonmoving heap). Fixes #23312.
Diffstat (limited to 'rts')
-rw-r--r--rts/sm/NonMovingAllocate.c4
-rw-r--r--rts/sm/Storage.c2
-rw-r--r--rts/sm/Storage.h2
3 files changed, 7 insertions, 1 deletions
diff --git a/rts/sm/NonMovingAllocate.c b/rts/sm/NonMovingAllocate.c
index c826a0ff3a..f6d2621f23 100644
--- a/rts/sm/NonMovingAllocate.c
+++ b/rts/sm/NonMovingAllocate.c
@@ -253,5 +253,9 @@ void *nonmovingAllocateGC(Capability *cap, StgWord sz)
GNUC_ATTR_HOT
void *nonmovingAllocate(Capability *cap, StgWord sz)
{
+ // Handle "bytes allocated" accounting in the same way we
+ // do in Storage.c:allocate. See #23312.
+ accountAllocation(cap, sz);
+ cap->total_allocated += sz;
return nonmovingAllocate_(SM_LOCK, cap, sz);
}
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 6d6500df9a..ec2f446a3f 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -966,7 +966,7 @@ move_STACK (StgStack *src, StgStack *dest)
dest->sp = (StgPtr)dest->sp + diff;
}
-STATIC_INLINE void
+void
accountAllocation(Capability *cap, W_ n)
{
TICK_ALLOC_HEAP_NOCTR(WDS(n));
diff --git a/rts/sm/Storage.h b/rts/sm/Storage.h
index 42c56fe164..a0d9af8de6 100644
--- a/rts/sm/Storage.h
+++ b/rts/sm/Storage.h
@@ -125,6 +125,8 @@ StgWord genLiveBlocks (generation *gen);
StgWord calcTotalLargeObjectsW (void);
StgWord calcTotalCompactW (void);
+void accountAllocation(Capability *cap, W_ n);
+
/* ----------------------------------------------------------------------------
Storage manager internal APIs and globals
------------------------------------------------------------------------- */