| Index: chromeos/hugepage_text/hugepage_text.cc
|
| diff --git a/chromeos/hugepage_text/hugepage_text.cc b/chromeos/hugepage_text/hugepage_text.cc
|
| index ccae53f723fdbd9e181f5421fd82c2fdc851062b..4856660fb44d0ffbdf9fb0ec3225fb1c18709946 100644
|
| --- a/chromeos/hugepage_text/hugepage_text.cc
|
| +++ b/chromeos/hugepage_text/hugepage_text.cc
|
| @@ -36,11 +36,6 @@ const int kMmapFlags = (MAP_ANONYMOUS | MAP_SHARED);
|
| const int kMmapHtlbFlags = (kMmapFlags | MAP_HUGETLB);
|
| const int kMremapFlags = (MREMAP_MAYMOVE | MREMAP_FIXED);
|
|
|
| -// The number of hugepages we want to use to map chrome text section
|
| -// to hugepages. With the help of AutoFDO, the hot functions are grouped
|
| -// in to a small area of the binary.
|
| -const int kNumHugePages = 15;
|
| -
|
| // mremap syscall is always supported for small page segment on all kernels.
|
| // However, it is not the case for hugepage.
|
| // If not used carefully, mremap() a hugepage segment directly onto small page
|
| @@ -129,10 +124,9 @@ static void NoAsanAlignedMemcpy(void* dst, void* src, size_t size) {
|
| // Effect: physical backing page changed from small page to hugepage. If there
|
| // are error condition, the remapping operation is aborted.
|
| static void MremapHugetlbText(void* vaddr, const size_t hsize) {
|
| + DCHECK_EQ(0ul, reinterpret_cast<uintptr_t>(vaddr) & ~kHpageMask);
|
| void* haddr = MAP_FAILED;
|
| -
|
| - if ((reinterpret_cast<intptr_t>(vaddr) & ~kHpageMask) == 0 &&
|
| - HugetlbMremapSupported()) {
|
| + if (HugetlbMremapSupported()) {
|
| // Try anon hugepage from static hugepage pool only if the source address
|
| // is hugepage aligned, otherwise, mremap below has non-recoverable error.
|
| haddr = mmap(NULL, hsize, kProtection, kMmapHtlbFlags, 0, 0);
|
| @@ -172,15 +166,18 @@ static void MremapHugetlbText(void* vaddr, const size_t hsize) {
|
| // Effect: physical backing page changed from small page to hugepage. If there
|
| // are error condition, the remaping operation is aborted.
|
| static void RemapHugetlbText(void* vaddr, const size_t segsize) {
|
| - int hsize = segsize;
|
| - if (segsize > kHpageSize * kNumHugePages)
|
| - hsize = kHpageSize * kNumHugePages;
|
| + // remove unaligned head regions
|
| + size_t head_gap = (kHpageSize - reinterpret_cast<size_t>(vaddr) % kHpageSize)
|
| + % kHpageSize;
|
| + size_t addr = reinterpret_cast<size_t>(vaddr) + head_gap;
|
| +
|
| + int hsize = segsize - head_gap;
|
| hsize = hsize & kHpageMask;
|
|
|
| if (hsize == 0)
|
| return;
|
|
|
| - MremapHugetlbText(vaddr, hsize);
|
| + MremapHugetlbText(reinterpret_cast<void *>(addr), hsize);
|
| }
|
|
|
| // For a given ELF program header descriptor, iterates over all segments within
|
|
|