@@ -3005,47 +3005,31 @@ static void accel_globals_dtor(zend_accel_globals *accel_globals)
30053005# if defined(MAP_HUGETLB ) || defined(MADV_HUGEPAGE )
30063006static 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