From 62ded6efbcb41e24a505117f8de5b70d56a98f57 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 27 May 2019 13:37:19 +0300 Subject: [PATCH] Align .text segment for better huge pages usage --- configure.ac | 7 +++++++ ext/opcache/ZendAccelerator.c | 23 ++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index c388ebae91..144a77d736 100644 --- a/configure.ac +++ b/configure.ac @@ -1224,6 +1224,13 @@ if test "$PHP_THREAD_SAFETY" = "yes"; then TSRM_THREADS_CHECKS fi +dnl Align segments on huge page boundary +case $host_alias in + *linux*) + EXTRA_LDFLAGS_PROGRAM="$EXTRA_LDFLAGS_PROGRAM -Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152" + ;; +esac + EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LDFLAGS" EXTRA_LDFLAGS_PROGRAM="$EXTRA_LDFLAGS_PROGRAM $LDFLAGS" EXTRA_LIBS="$EXTRA_LIBS $LIBS" diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 62381ddbfa..b78dee73f6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2616,7 +2616,7 @@ static void accel_gen_system_id(void) # endif # if defined(MAP_HUGETLB) || defined(MADV_HUGEPAGE) -static int accel_remap_huge_pages(void *start, size_t size, const char *name, size_t offset) +static int accel_remap_huge_pages(void *start, size_t size, size_t real_size, const char *name, size_t offset) { void *ret = MAP_FAILED; void *mem; @@ -2631,7 +2631,7 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si strerror(errno), errno); return -1; } - memcpy(mem, start, size); + memcpy(mem, start, real_size); # ifdef MAP_HUGETLB ret = mmap(start, size, @@ -2648,7 +2648,7 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si ZEND_ASSERT(ret != MAP_FAILED); # ifdef MADV_HUGEPAGE if (-1 == madvise(start, size, MADV_HUGEPAGE)) { - memcpy(start, mem, size); + memcpy(start, mem, real_size); mprotect(start, size, PROT_READ | PROT_EXEC); munmap(mem, size); zend_error(E_WARNING, @@ -2657,7 +2657,7 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si return -1; } # else - memcpy(start, mem, size); + memcpy(start, mem, real_size); mprotect(start, size, PROT_READ | PROT_EXEC); munmap(mem, size); zend_error(E_WARNING, @@ -2668,7 +2668,7 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si } if (ret == start) { - memcpy(start, mem, size); + memcpy(start, mem, real_size); mprotect(start, size, PROT_READ | PROT_EXEC); } munmap(mem, size); @@ -2694,10 +2694,19 @@ static void accel_move_code_to_huge_pages(void) if (perm[0] == 'r' && perm[1] == '-' && perm[2] == 'x' && name[0] == '/') { long unsigned int seg_start = ZEND_MM_ALIGNED_SIZE_EX(start, huge_page_size); long unsigned int seg_end = (end & ~(huge_page_size-1L)); + long unsigned int real_end; + + ret = fscanf(f, "%lx-", &start); + if (ret == 1 && start == seg_end + huge_page_size) { + real_end = end; + seg_end = start; + } else { + real_end = seg_end; + } if (seg_end > seg_start) { zend_accel_error(ACCEL_LOG_DEBUG, "remap to huge page %lx-%lx %s \n", seg_start, seg_end, name); - accel_remap_huge_pages((void*)seg_start, seg_end - seg_start, name, offset + seg_start - start); + accel_remap_huge_pages((void*)seg_start, seg_end - seg_start, real_end - seg_start, name, offset + seg_start - start); } break; } @@ -2731,7 +2740,7 @@ static void accel_move_code_to_huge_pages(void) long unsigned int seg_end = (end & ~(huge_page_size-1L)); if (seg_end > seg_start) { zend_accel_error(ACCEL_LOG_DEBUG, "remap to huge page %lx-%lx %s \n", seg_start, seg_end, entry->kve_path); - accel_remap_huge_pages((void*)seg_start, seg_end - seg_start, entry->kve_path, entry->kve_offset + seg_start - start); + accel_remap_huge_pages((void*)seg_start, seg_end - seg_start, seg_end - seg_start, entry->kve_path, entry->kve_offset + seg_start - start); } } start += sz; -- 2.40.0