@@ -662,18 +662,28 @@ static zend_always_inline int zend_mm_bitset_is_free_range(zend_mm_bitset *bitse
662662/* Chunks */
663663/**********/
664664
665+ static zend_always_inline void zend_mm_hugepage (void * ptr , size_t size )
666+ {
667+ #if defined(MADV_HUGEPAGE )
668+ (void )madvise (ptr , size , MADV_HUGEPAGE );
669+ #elif defined(HAVE_MEMCNTL )
670+ struct memcntl_mha m = {.mha_cmd = MHA_MAPSIZE_VA , .mha_pagesize = ZEND_MM_CHUNK_SIZE , .mha_flags = 0 };
671+ (void )memcntl (ptr , size , MC_HAT_ADVISE , (char * )& m , 0 , 0 );
672+ #else
673+ zend_error_noreturn (E_WARNING , "huge_pages: thp unsupported on this platform" );
674+ #endif
675+ }
676+
665677static void * zend_mm_chunk_alloc_int (size_t size , size_t alignment )
666678{
667679 void * ptr = zend_mm_mmap (size );
668680
669681 if (ptr == NULL ) {
670682 return NULL ;
671683 } else if (ZEND_MM_ALIGNED_OFFSET (ptr , alignment ) == 0 ) {
672- #ifdef MADV_HUGEPAGE
673684 if (zend_mm_use_huge_pages ) {
674- madvise (ptr , size , MADV_HUGEPAGE );
685+ zend_mm_hugepage (ptr , size );
675686 }
676- #endif
677687 return ptr ;
678688 } else {
679689 size_t offset ;
@@ -702,11 +712,9 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
702712 if (alignment > REAL_PAGE_SIZE ) {
703713 zend_mm_munmap ((char * )ptr + size , alignment - REAL_PAGE_SIZE );
704714 }
705- # ifdef MADV_HUGEPAGE
706715 if (zend_mm_use_huge_pages ) {
707- madvise (ptr , size , MADV_HUGEPAGE );
716+ zend_mm_hugepage (ptr , size );
708717 }
709- # endif
710718#endif
711719 return ptr ;
712720 }
0 commit comments