summaryrefslogtreecommitdiffstats
path: root/chromeos
diff options
context:
space:
mode:
authoryunlian <yunlian@chromium.org>2016-02-04 16:10:08 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-05 00:11:23 +0000
commit1384534a94e6324d74906f0cbc1e707606c063f2 (patch)
tree48650bc0e83cd3d8df94784a9470640c354473e2 /chromeos
parent9022cb435a91083c86633d6672f92ca6643cb229 (diff)
downloadchromium_src-1384534a94e6324d74906f0cbc1e707606c063f2.zip
chromium_src-1384534a94e6324d74906f0cbc1e707606c063f2.tar.gz
chromium_src-1384534a94e6324d74906f0cbc1e707606c063f2.tar.bz2
Make text section 2MB aligned for hugepages.
If we do not use the option '-Wl,--section-start=.text=2001000' at link time, the performance gain on hugepages is gone. This is probably because the original text section is not 2MB aligned and the after mremap, the hugepage is not preserved. BUG=chromium:569963 TEST=The performance gain is back on micro benchmarks. Review URL: https://codereview.chromium.org/1619713007 Cr-Commit-Position: refs/heads/master@{#373673}
Diffstat (limited to 'chromeos')
-rw-r--r--chromeos/hugepage_text/hugepage_text.cc21
1 files changed, 9 insertions, 12 deletions
diff --git a/chromeos/hugepage_text/hugepage_text.cc b/chromeos/hugepage_text/hugepage_text.cc
index ccae53f..4856660 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