Skip to content

Commit e52e665

Browse files
committed
Fix opcache.huge_code_pages
1 parent d8e014d commit e52e665

File tree

1 file changed

+18
-31
lines changed

1 file changed

+18
-31
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3005,47 +3005,31 @@ static void accel_globals_dtor(zend_accel_globals *accel_globals)
30053005
# if defined(MAP_HUGETLB) || defined(MADV_HUGEPAGE)
30063006
static zend_result accel_remap_huge_pages(void *start, size_t size, size_t real_size, const char *name, size_t offset)
30073007
{
3008-
void *ret = MAP_FAILED;
3009-
void *mem;
3010-
3011-
mem = mmap(NULL, size,
3012-
PROT_READ | PROT_WRITE,
3013-
MAP_PRIVATE | MAP_ANONYMOUS,
3014-
-1, 0);
3015-
if (mem == MAP_FAILED) {
3016-
zend_error(E_WARNING,
3017-
ACCELERATOR_PRODUCT_NAME " huge_code_pages: mmap failed: %s (%d)",
3018-
strerror(errno), errno);
3019-
return FAILURE;
3020-
}
3021-
memcpy(mem, start, real_size);
3008+
void *ret;
3009+
void *mem = MAP_FAILED;
30223010

30233011
# ifdef MAP_HUGETLB
3024-
ret = mmap(start, size,
3012+
mem = mmap(NULL, size,
30253013
PROT_READ | PROT_WRITE | PROT_EXEC,
3026-
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_HUGETLB,
3014+
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
30273015
-1, 0);
30283016
# endif
3029-
if (ret == MAP_FAILED) {
3030-
ret = mmap(start, size,
3017+
if (mem == MAP_FAILED) {
3018+
mem = mmap(NULL, size,
30313019
PROT_READ | PROT_WRITE | PROT_EXEC,
3032-
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
3020+
MAP_PRIVATE | MAP_ANONYMOUS,
30333021
-1, 0);
30343022
/* this should never happen? */
3035-
ZEND_ASSERT(ret != MAP_FAILED);
3023+
ZEND_ASSERT(mem != MAP_FAILED);
30363024
# ifdef MADV_HUGEPAGE
3037-
if (-1 == madvise(start, size, MADV_HUGEPAGE)) {
3038-
memcpy(start, mem, real_size);
3039-
mprotect(start, size, PROT_READ | PROT_EXEC);
3025+
if (-1 == madvise(mem, size, MADV_HUGEPAGE)) {
30403026
munmap(mem, size);
30413027
zend_error(E_WARNING,
30423028
ACCELERATOR_PRODUCT_NAME " huge_code_pages: madvise(HUGEPAGE) failed: %s (%d)",
30433029
strerror(errno), errno);
30443030
return FAILURE;
30453031
}
30463032
# else
3047-
memcpy(start, mem, real_size);
3048-
mprotect(start, size, PROT_READ | PROT_EXEC);
30493033
munmap(mem, size);
30503034
zend_error(E_WARNING,
30513035
ACCELERATOR_PRODUCT_NAME " huge_code_pages: mmap(HUGETLB) failed: %s (%d)",
@@ -3054,13 +3038,16 @@ static zend_result accel_remap_huge_pages(void *start, size_t size, size_t real_
30543038
# endif
30553039
}
30563040

3057-
// Given the MAP_FIXED flag the address can never diverge
3058-
ZEND_ASSERT(ret == start);
3041+
memcpy(mem, start, real_size);
3042+
mprotect(mem, size, PROT_READ | PROT_EXEC);
3043+
ret = mremap(mem, size, size, MREMAP_MAYMOVE | MREMAP_FIXED, start);
3044+
if (ret == MAP_FAILED) {
3045+
munmap(mem, size);
3046+
zend_error(E_WARNING,
3047+
ACCELERATOR_PRODUCT_NAME " huge_code_pages: mremap() failed: %s (%d)",
3048+
strerror(errno), errno);
3049+
}
30593050
zend_mmap_set_name(start, size, "zend_huge_code_pages");
3060-
memcpy(start, mem, real_size);
3061-
mprotect(start, size, PROT_READ | PROT_EXEC);
3062-
3063-
munmap(mem, size);
30643051

30653052
return SUCCESS;
30663053
}

0 commit comments

Comments
 (0)