@@ -662,18 +662,28 @@ static zend_always_inline int zend_mm_bitset_is_free_range(zend_mm_bitset *bitse
662
662
/* Chunks */
663
663
/**********/
664
664
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
+
665
677
static void * zend_mm_chunk_alloc_int (size_t size , size_t alignment )
666
678
{
667
679
void * ptr = zend_mm_mmap (size );
668
680
669
681
if (ptr == NULL ) {
670
682
return NULL ;
671
683
} else if (ZEND_MM_ALIGNED_OFFSET (ptr , alignment ) == 0 ) {
672
- #ifdef MADV_HUGEPAGE
673
684
if (zend_mm_use_huge_pages ) {
674
- madvise (ptr , size , MADV_HUGEPAGE );
685
+ zend_mm_hugepage (ptr , size );
675
686
}
676
- #endif
677
687
return ptr ;
678
688
} else {
679
689
size_t offset ;
@@ -702,11 +712,9 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
702
712
if (alignment > REAL_PAGE_SIZE ) {
703
713
zend_mm_munmap ((char * )ptr + size , alignment - REAL_PAGE_SIZE );
704
714
}
705
- # ifdef MADV_HUGEPAGE
706
715
if (zend_mm_use_huge_pages ) {
707
- madvise (ptr , size , MADV_HUGEPAGE );
716
+ zend_mm_hugepage (ptr , size );
708
717
}
709
- # endif
710
718
#endif
711
719
return ptr ;
712
720
}
0 commit comments