]> granicus.if.org Git - php/commitdiff
Align .text segment for better huge pages usage
authorDmitry Stogov <dmitry@zend.com>
Mon, 27 May 2019 10:37:19 +0000 (13:37 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 27 May 2019 10:37:19 +0000 (13:37 +0300)
configure.ac
ext/opcache/ZendAccelerator.c

index c388ebae91ddafe5637cb582a8b3a32af59629cd..144a77d7366685e7c199cce0d7cd059f89210673 100644 (file)
@@ -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"
index 62381ddbfaf3509c47a68d35d6601c631cdcd795..b78dee73f6f76310a05d3b56fe6443bd8c554bbb 100644 (file)
@@ -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;