@@ -2624,6 +2624,12 @@ static void accel_gen_system_id(void)
2624
2624
# ifndef MAP_FAILED
2625
2625
# define MAP_FAILED ((void*)-1)
2626
2626
# endif
2627
+ # ifdef MAP_ALIGNED_SUPER
2628
+ # include <sys/types.h>
2629
+ # include <sys/sysctl.h>
2630
+ # include <sys/user.h>
2631
+ # define MAP_HUGETLB MAP_ALIGNED_SUPER
2632
+ # endif
2627
2633
# endif
2628
2634
2629
2635
# if defined(MAP_HUGETLB ) || defined(MADV_HUGEPAGE )
@@ -2689,6 +2695,7 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si
2689
2695
2690
2696
static void accel_move_code_to_huge_pages (void )
2691
2697
{
2698
+ #if defined(__linux__ )
2692
2699
FILE * f ;
2693
2700
long unsigned int huge_page_size = 2 * 1024 * 1024 ;
2694
2701
@@ -2710,6 +2717,39 @@ static void accel_move_code_to_huge_pages(void)
2710
2717
}
2711
2718
fclose (f );
2712
2719
}
2720
+ #elif defined(__FreeBSD__ )
2721
+ size_t s = 0 ;
2722
+ int mib [4 ] = {CTL_KERN , KERN_PROC , KERN_PROC_VMMAP , getpid ()};
2723
+ long unsigned int huge_page_size = 2 * 1024 * 1024 ;
2724
+ if (sysctl (mib , 4 , NULL , & s , NULL , 0 ) == 0 ) {
2725
+ void * addr = mmap (NULL , s * sizeof (struct kinfo_vmentry ), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANON , -1 , 0 );
2726
+ if (addr != MAP_FAILED ) {
2727
+ s = s * 4 / 3 ;
2728
+ if (sysctl (mib , 4 , addr , & s , NULL , 0 ) == 0 ) {
2729
+ uintptr_t start = (uintptr_t )addr ;
2730
+ uintptr_t end = start + s ;
2731
+ while (start < end ) {
2732
+ struct kinfo_vmentry * entry = (struct kinfo_vmentry * )start ;
2733
+ size_t sz = entry -> kve_structsize ;
2734
+ if (sz == 0 ) {
2735
+ break ;
2736
+ }
2737
+ int permflags = entry -> kve_protection ;
2738
+ if ((permflags & KVME_PROT_READ ) && !(permflags & KVME_PROT_WRITE ) &&
2739
+ (permflags & KVME_PROT_EXEC ) && entry -> kve_path [0 ] != '\0' ) {
2740
+ long unsigned int seg_start = ZEND_MM_ALIGNED_SIZE_EX (start , huge_page_size );
2741
+ long unsigned int seg_end = (end & ~(huge_page_size - 1L ));
2742
+ if (seg_end > seg_start ) {
2743
+ zend_accel_error (ACCEL_LOG_DEBUG , "remap to huge page %lx-%lx %s \n" , seg_start , seg_end , entry -> kve_path );
2744
+ accel_remap_huge_pages ((void * )seg_start , seg_end - seg_start , entry -> kve_path , entry -> kve_offset + seg_start - start );
2745
+ }
2746
+ }
2747
+ start += sz ;
2748
+ }
2749
+ }
2750
+ }
2751
+ }
2752
+ #endif
2713
2753
}
2714
2754
# else
2715
2755
static void accel_move_code_to_huge_pages (void )
0 commit comments