Skip to content

Commit b71c44b

Browse files
authored
[scudo] Add the record of number of attempted page release (llvm#120497)
This also removes the `RangesReleased` which doesn't give much insight to whether we should adjust the heuristic of doing page release.
1 parent 21684e3 commit b71c44b

File tree

3 files changed

+19
-24
lines changed

3 files changed

+19
-24
lines changed

compiler-rt/lib/scudo/standalone/primary32.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ template <typename Config> class SizeClassAllocator32 {
387387

388388
struct ReleaseToOsInfo {
389389
uptr BytesInFreeListAtLastCheckpoint;
390-
uptr RangesReleased;
390+
uptr NumReleasesAttempted;
391391
uptr LastReleasedBytes;
392392
u64 LastReleaseAtNs;
393393
};
@@ -880,14 +880,14 @@ template <typename Config> class SizeClassAllocator32 {
880880
BytesInFreeList - Sci->ReleaseInfo.BytesInFreeListAtLastCheckpoint;
881881
}
882882
const uptr AvailableChunks = Sci->AllocatedUser / BlockSize;
883-
Str->append(" %02zu (%6zu): mapped: %6zuK popped: %7zu pushed: %7zu "
884-
"inuse: %6zu avail: %6zu releases: %6zu last released: %6zuK "
885-
"latest pushed bytes: %6zuK\n",
886-
ClassId, getSizeByClassId(ClassId), Sci->AllocatedUser >> 10,
887-
Sci->FreeListInfo.PoppedBlocks, Sci->FreeListInfo.PushedBlocks,
888-
InUse, AvailableChunks, Sci->ReleaseInfo.RangesReleased,
889-
Sci->ReleaseInfo.LastReleasedBytes >> 10,
890-
PushedBytesDelta >> 10);
883+
Str->append(
884+
" %02zu (%6zu): mapped: %6zuK popped: %7zu pushed: %7zu "
885+
"inuse: %6zu avail: %6zu releases attempted: %6zu last released: %6zuK "
886+
"latest pushed bytes: %6zuK\n",
887+
ClassId, getSizeByClassId(ClassId), Sci->AllocatedUser >> 10,
888+
Sci->FreeListInfo.PoppedBlocks, Sci->FreeListInfo.PushedBlocks, InUse,
889+
AvailableChunks, Sci->ReleaseInfo.NumReleasesAttempted,
890+
Sci->ReleaseInfo.LastReleasedBytes >> 10, PushedBytesDelta >> 10);
891891
}
892892

893893
void getSizeClassFragmentationInfo(SizeClassInfo *Sci, uptr ClassId,
@@ -972,6 +972,10 @@ template <typename Config> class SizeClassAllocator32 {
972972
const uptr Base = First * RegionSize;
973973
const uptr NumberOfRegions = Last - First + 1U;
974974

975+
// The following steps contribute to the majority time spent in page
976+
// releasing thus we increment the counter here.
977+
++Sci->ReleaseInfo.NumReleasesAttempted;
978+
975979
// ==================================================================== //
976980
// 2. Mark the free blocks and we can tell which pages are in-use by
977981
// querying `PageReleaseContext`.
@@ -991,9 +995,8 @@ template <typename Config> class SizeClassAllocator32 {
991995
};
992996
releaseFreeMemoryToOS(Context, Recorder, SkipRegion);
993997

994-
if (Recorder.getReleasedRangesCount() > 0) {
998+
if (Recorder.getReleasedBytes() > 0) {
995999
Sci->ReleaseInfo.BytesInFreeListAtLastCheckpoint = BytesInFreeList;
996-
Sci->ReleaseInfo.RangesReleased += Recorder.getReleasedRangesCount();
9971000
Sci->ReleaseInfo.LastReleasedBytes = Recorder.getReleasedBytes();
9981001
TotalReleasedBytes += Sci->ReleaseInfo.LastReleasedBytes;
9991002
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ template <typename Config> class SizeClassAllocator64 {
530530

531531
struct ReleaseToOsInfo {
532532
uptr BytesInFreeListAtLastCheckpoint;
533-
uptr RangesReleased;
533+
uptr NumReleasesAttempted;
534534
uptr LastReleasedBytes;
535535
// The minimum size of pushed blocks to trigger page release.
536536
uptr TryReleaseThreshold;
@@ -1144,11 +1144,12 @@ template <typename Config> class SizeClassAllocator64 {
11441144
Str->append(
11451145
"%s %02zu (%6zu): mapped: %6zuK popped: %7zu pushed: %7zu "
11461146
"inuse: %6zu total: %6zu releases: %6zu last "
1147-
"released: %6zuK latest pushed bytes: %6zuK region: 0x%zx (0x%zx)\n",
1147+
"releases attempted: %6zuK latest pushed bytes: %6zuK region: 0x%zx "
1148+
"(0x%zx)\n",
11481149
Region->Exhausted ? "E" : " ", ClassId, getSizeByClassId(ClassId),
11491150
Region->MemMapInfo.MappedUser >> 10, Region->FreeListInfo.PoppedBlocks,
11501151
Region->FreeListInfo.PushedBlocks, InUseBlocks, TotalChunks,
1151-
Region->ReleaseInfo.RangesReleased,
1152+
Region->ReleaseInfo.NumReleasesAttempted,
11521153
Region->ReleaseInfo.LastReleasedBytes >> 10,
11531154
RegionPushedBytesDelta >> 10, Region->RegionBeg,
11541155
getRegionBaseByClassId(ClassId));
@@ -1322,7 +1323,7 @@ template <typename Config> class SizeClassAllocator64 {
13221323
Context.getReleaseOffset());
13231324
auto SkipRegion = [](UNUSED uptr RegionIndex) { return false; };
13241325
releaseFreeMemoryToOS(Context, Recorder, SkipRegion);
1325-
if (Recorder.getReleasedRangesCount() > 0) {
1326+
if (Recorder.getReleasedBytes() > 0) {
13261327
// This is the case that we didn't hit the release threshold but it has
13271328
// been past a certain period of time. Thus we try to release some pages
13281329
// and if it does release some additional pages, it's hint that we are
@@ -1342,7 +1343,6 @@ template <typename Config> class SizeClassAllocator64 {
13421343
}
13431344

13441345
Region->ReleaseInfo.BytesInFreeListAtLastCheckpoint = BytesInFreeList;
1345-
Region->ReleaseInfo.RangesReleased += Recorder.getReleasedRangesCount();
13461346
Region->ReleaseInfo.LastReleasedBytes = Recorder.getReleasedBytes();
13471347
}
13481348
Region->ReleaseInfo.LastReleaseAtNs = getMonotonicTimeFast();

compiler-rt/lib/scudo/standalone/release.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ template <typename MemMapT> class RegionReleaseRecorder {
2222
RegionReleaseRecorder(MemMapT *RegionMemMap, uptr Base, uptr Offset = 0)
2323
: RegionMemMap(RegionMemMap), Base(Base), Offset(Offset) {}
2424

25-
uptr getReleasedRangesCount() const { return ReleasedRangesCount; }
26-
2725
uptr getReleasedBytes() const { return ReleasedBytes; }
2826

2927
uptr getBase() const { return Base; }
@@ -33,12 +31,10 @@ template <typename MemMapT> class RegionReleaseRecorder {
3331
void releasePageRangeToOS(uptr From, uptr To) {
3432
const uptr Size = To - From;
3533
RegionMemMap->releasePagesToOS(getBase() + Offset + From, Size);
36-
ReleasedRangesCount++;
3734
ReleasedBytes += Size;
3835
}
3936

4037
private:
41-
uptr ReleasedRangesCount = 0;
4238
uptr ReleasedBytes = 0;
4339
MemMapT *RegionMemMap = nullptr;
4440
uptr Base = 0;
@@ -52,8 +48,6 @@ class ReleaseRecorder {
5248
ReleaseRecorder(uptr Base, uptr Offset = 0, MapPlatformData *Data = nullptr)
5349
: Base(Base), Offset(Offset), Data(Data) {}
5450

55-
uptr getReleasedRangesCount() const { return ReleasedRangesCount; }
56-
5751
uptr getReleasedBytes() const { return ReleasedBytes; }
5852

5953
uptr getBase() const { return Base; }
@@ -62,12 +56,10 @@ class ReleaseRecorder {
6256
void releasePageRangeToOS(uptr From, uptr To) {
6357
const uptr Size = To - From;
6458
releasePagesToOS(Base, From + Offset, Size, Data);
65-
ReleasedRangesCount++;
6659
ReleasedBytes += Size;
6760
}
6861

6962
private:
70-
uptr ReleasedRangesCount = 0;
7163
uptr ReleasedBytes = 0;
7264
// The starting address to release. Note that we may want to combine (Base +
7365
// Offset) as a new Base. However, the Base is retrieved from

0 commit comments

Comments
 (0)