[compiler-rt] Reapply "[scudo] Fix the logic of MaxAllowedFragmentedPages" (#108130) (PR #108134)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 10 19:06:05 PDT 2024
https://github.com/ChiaHungDuan created https://github.com/llvm/llvm-project/pull/108134
This reverts commit 76151c449080b7239c8b442291514a4300d51cba.
Also changed to check MaxAllowedFragmentedPages.
>From 9a6f3182f439d34826bd96f01e586e786ec4bb29 Mon Sep 17 00:00:00 2001
From: Chia-hung Duan <chiahungduan at google.com>
Date: Wed, 11 Sep 2024 01:59:08 +0000
Subject: [PATCH] Reapply "[scudo] Fix the logic of MaxAllowedFragmentedPages"
(#108130)
This reverts commit 76151c449080b7239c8b442291514a4300d51cba.
---
compiler-rt/lib/scudo/standalone/secondary.h | 25 +++++++++++++-------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/compiler-rt/lib/scudo/standalone/secondary.h b/compiler-rt/lib/scudo/standalone/secondary.h
index 1a232b9b9fb2d7..2fae29e5a21687 100644
--- a/compiler-rt/lib/scudo/standalone/secondary.h
+++ b/compiler-rt/lib/scudo/standalone/secondary.h
@@ -72,13 +72,16 @@ namespace {
struct CachedBlock {
static constexpr u16 CacheIndexMax = UINT16_MAX;
static constexpr u16 InvalidEntry = CacheIndexMax;
- // * MaxReleasedCachePages default is currently 4
- // - We arrived at this value after noticing that mapping
- // in larger memory regions performs better than releasing
- // memory and forcing a cache hit. According to the data,
- // it suggests that beyond 4 pages, the release execution time is
- // longer than the map execution time. In this way, the default
- // is dependent on the platform.
+ // We allow a certain amount of fragmentation and part of the fragmented bytes
+ // will be released by `releaseAndZeroPagesToOS()`. This increases the chance
+ // of cache hit rate and reduces the overhead to the RSS at the same time. See
+ // more details in the `MapAllocatorCache::retrieve()` section.
+ //
+ // We arrived at this default value after noticing that mapping in larger
+ // memory regions performs better than releasing memory and forcing a cache
+ // hit. According to the data, it suggests that beyond 4 pages, the release
+ // execution time is longer than the map execution time. In this way,
+ // the default is dependent on the platform.
static constexpr uptr MaxReleasedCachePages = 4U;
uptr CommitBase = 0;
@@ -725,8 +728,14 @@ MapAllocator<Config>::tryAllocateFromCache(const Options &Options, uptr Size,
uptr EntryHeaderPos;
uptr MaxAllowedFragmentedPages = MaxUnreleasedCachePages;
- if (UNLIKELY(useMemoryTagging<Config>(Options)))
+ if (LIKELY(!useMemoryTagging<Config>(Options))) {
MaxAllowedFragmentedPages += CachedBlock::MaxReleasedCachePages;
+ } else {
+ // TODO: Enable MaxReleasedCachePages may result in pages for an entry being
+ // partially released and it erases the tag of those pages as well. To
+ // support this feature for MTE, we need to tag those pages again.
+ DCHECK_EQ(MaxAllowedFragmentedPages, MaxUnreleasedCachePages);
+ }
Entry = Cache.retrieve(MaxAllowedFragmentedPages, Size, Alignment,
getHeadersSize(), EntryHeaderPos);
More information about the llvm-commits
mailing list