[SanitizerCommon] Reduce wasting memory in LowLevelAllocator.

MmapOrDie allocates memory multiple to page size. LowLevelAllocator
should use all that memory for the internal buffer because there are
chances that subsequent requests may be small enough to fit in that
space.

Differential Revision: https://reviews.llvm.org/D71275
This commit is contained in:
Igor Kudrin 2019-12-10 21:44:17 +07:00
parent f7235ac1d3
commit 3a713ae5fa
2 changed files with 12 additions and 1 deletions

View File

@ -213,7 +213,7 @@ void *LowLevelAllocator::Allocate(uptr size) {
// Align allocation size.
size = RoundUpTo(size, low_level_alloc_min_alignment);
if (allocated_end_ - allocated_current_ < (sptr)size) {
uptr size_to_allocate = Max(size, GetPageSizeCached());
uptr size_to_allocate = RoundUpTo(size, GetPageSizeCached());
allocated_current_ =
(char*)MmapOrDie(size_to_allocate, __func__);
allocated_end_ = allocated_current_ + size_to_allocate;

View File

@ -1404,4 +1404,15 @@ TEST(SanitizerCommon, ThreadedTwoLevelByteMap) {
EXPECT_EQ((uptr)TestMapUnmapCallback::unmap_count, m.size1());
}
TEST(SanitizerCommon, LowLevelAllocatorShouldRoundUpSizeOnAlloc) {
// When allocating a memory block slightly bigger than a memory page and
// LowLevelAllocator calls MmapOrDie for the internal buffer, it should round
// the size up to the page size, so that subsequent calls to the allocator
// can use the remaining space in the last allocated page.
static LowLevelAllocator allocator;
char *ptr1 = (char *)allocator.Allocate(GetPageSizeCached() + 16);
char *ptr2 = (char *)allocator.Allocate(16);
EXPECT_EQ(ptr2, ptr1 + GetPageSizeCached() + 16);
}
#endif // #if !SANITIZER_DEBUG