[compiler-rt] [scudo] Release to OS if a large amount of memory is deallocated. (PR #160621)

Christopher Ferris via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 24 17:54:13 PDT 2025


https://github.com/cferris1000 created https://github.com/llvm/llvm-project/pull/160621

Before this change, if large amounts of memory are deallocated within a release interval, the release is put off until the release interval occurs. Unfortunately, for larger class sizes, this could mean that a lot of this memory accumulates and is never released since no more deallocations occur in that size class.

To fix this, if `RegionPushedBytesDelta` grows larger than a group size, immediately do a release.

This work was originally done by ChiaHungDuan.

>From f72e3aeb10e41e0a7bcc77acea549cda44703b1d Mon Sep 17 00:00:00 2001
From: Christopher Ferris <cferris at google.com>
Date: Wed, 24 Sep 2025 17:35:10 -0700
Subject: [PATCH] [scudo] Release to OS if a large amount of memory is
 deallocated.

Before this change, if large amounts of memory are deallocated within
a release interval, the release is put off until the release interval
occurs. Unfortunately, for larger class sizes, this could mean that
a lot of this memory accumulates and is never released since no more
deallocations occur in that size class.

To fix this, if `RegionPushedBytesDelta` grows larger than a
group size, immediately do a release.

This work was originally done by ChiaHungDuan.
---
 compiler-rt/lib/scudo/standalone/primary64.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/compiler-rt/lib/scudo/standalone/primary64.h b/compiler-rt/lib/scudo/standalone/primary64.h
index d08103008ef7c..747b1a2233d32 100644
--- a/compiler-rt/lib/scudo/standalone/primary64.h
+++ b/compiler-rt/lib/scudo/standalone/primary64.h
@@ -1565,6 +1565,13 @@ bool SizeClassAllocator64<Config>::hasChanceToReleasePages(
       if (DiffSinceLastReleaseNs < 2 * IntervalNs)
         return false;
     } else if (DiffSinceLastReleaseNs < IntervalNs) {
+      // `TryReleaseThreshold` is capped by (1UL << GroupSizeLog) / 2). If
+      // RegionPushedBytesDelta grows to twice the threshold, it implies some
+      // huge deallocations have happened so we better try to release some
+      // pages. Note this tends to happen for larger block sizes.
+      if (RegionPushedBytesDelta > (1ULL << GroupSizeLog))
+        return true;
+
       // In this case, we are over the threshold but we just did some page
       // release in the same release interval. This is a hint that we may want
       // a higher threshold so that we can release more memory at once.



More information about the llvm-commits mailing list