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

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 25 12:29:40 PDT 2025


Author: Christopher Ferris
Date: 2025-09-25T12:29:35-07:00
New Revision: 885cb59315f974b261945686177cfa23833793bd

URL: https://github.com/llvm/llvm-project/commit/885cb59315f974b261945686177cfa23833793bd
DIFF: https://github.com/llvm/llvm-project/commit/885cb59315f974b261945686177cfa23833793bd.diff

LOG: [scudo] Release to OS if a large amount of memory is deallocated. (#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.

Added: 
    

Modified: 
    compiler-rt/lib/scudo/standalone/primary64.h

Removed: 
    


################################################################################
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