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::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.