[PATCH] D71275: [SanitizerCommon] Avoid wasting memory in LowLevelAllocator
Igor Kudrin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 10 07:46:55 PST 2019
ikudrin created this revision.
ikudrin added reviewers: kcc, samsonov, eugenis.
ikudrin added projects: Sanitizers, LLVM.
`MmapOrDie` allocates memory multiple to page size. `LowLevelAllocator` should use all that memory for the internal buffer because there are chances that subsequent allocations may be small enough to be placed in that space.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D71275
Files:
compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp
compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cpp
Index: compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cpp
===================================================================
--- compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cpp
+++ compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cpp
@@ -1404,4 +1404,15 @@
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
Index: compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp
===================================================================
--- compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp
+++ compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp
@@ -213,7 +213,7 @@
// 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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71275.233091.patch
Type: text/x-patch
Size: 1684 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191210/9658b79e/attachment.bin>
More information about the llvm-commits
mailing list