@@ -2480,6 +2480,92 @@ static void accel_gen_system_id(void)
2480
2480
}
2481
2481
#endif
2482
2482
2483
+ #ifdef HAVE_HUGE_CODE_PAGES
2484
+ # ifndef _WIN32
2485
+ # include <sys/mman.h>
2486
+ # include <sys/prctl.h>
2487
+ # ifndef MAP_ANON
2488
+ # ifdef MAP_ANONYMOUS
2489
+ # define MAP_ANON MAP_ANONYMOUS
2490
+ # endif
2491
+ # endif
2492
+ # ifndef MAP_FAILED
2493
+ # define MAP_FAILED ((void*)-1)
2494
+ # endif
2495
+ # endif
2496
+
2497
+ # if defined(MAP_HUGETLB ) || defined(MADV_HUGEPAGE )
2498
+ static int accel_remap_huge_pages (void * start , size_t size , const char * name , size_t offset )
2499
+ {
2500
+ void * ret = MAP_FAILED ;
2501
+ void * mem ;
2502
+ int fd ;
2503
+
2504
+ fd = open (name , O_RDONLY );
2505
+ if (fd < 0 ) {
2506
+ return -1 ;
2507
+ }
2508
+ mem = mmap (NULL , size ,
2509
+ PROT_READ ,
2510
+ MAP_PRIVATE | MAP_FILE | MAP_POPULATE ,
2511
+ fd , offset );
2512
+ if (mem == MAP_FAILED ) {
2513
+ close (fd );
2514
+ return -1 ;
2515
+ }
2516
+
2517
+ #ifdef MAP_HUGETLB
2518
+ ret = mmap (start , size ,
2519
+ PROT_READ | PROT_WRITE | PROT_EXEC ,
2520
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_HUGETLB ,
2521
+ -1 , 0 );
2522
+ #endif
2523
+ #ifdef MADV_HUGEPAGE
2524
+ if (ret == MAP_FAILED ) {
2525
+ ret = mmap (start , size ,
2526
+ PROT_READ | PROT_WRITE | PROT_EXEC ,
2527
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED ,
2528
+ -1 , 0 );
2529
+ madvise (start , size , MADV_HUGEPAGE );
2530
+ }
2531
+ #endif
2532
+ if (ret == start ) {
2533
+ memcpy (start , mem , size );
2534
+ mprotect (start , size , PROT_READ | PROT_EXEC );
2535
+ }
2536
+ munmap (mem , size );
2537
+ close (fd );
2538
+
2539
+ return (ret == start ) ? 0 : -1 ;
2540
+ }
2541
+
2542
+ static void accel_move_code_to_huge_pages (void )
2543
+ {
2544
+ FILE * f ;
2545
+ long unsigned int huge_page_size = 2 * 1024 * 1024 ;
2546
+
2547
+ f = fopen ("/proc/self/maps" , "r" );
2548
+ if (f ) {
2549
+ long unsigned int start , end , offset , inode ;
2550
+ char perm [5 ], dev [6 ], name [MAXPATHLEN ];
2551
+ int ret ;
2552
+
2553
+ ret = fscanf (f , "%lx-%lx %4s %lx %5s %ld %s\n" , & start , & end , perm , & offset , dev , & inode , name );
2554
+ if (ret == 7 && perm [0 ] == 'r' && perm [1 ] == '-' && perm [2 ] == 'x' && name [0 ] == '/' ) {
2555
+ long unsigned int seg_start = ZEND_MM_ALIGNED_SIZE_EX (start , huge_page_size );
2556
+ long unsigned int seg_end = (end & ~(huge_page_size - 1L ));
2557
+
2558
+ if (seg_end > seg_start ) {
2559
+ zend_accel_error (ACCEL_LOG_DEBUG , "remap to huge page %lx-%lx %s \n" , seg_start , seg_end , name );
2560
+ accel_remap_huge_pages ((void * )seg_start , seg_end - seg_start , name , offset + seg_start - start );
2561
+ }
2562
+ }
2563
+ fclose (f );
2564
+ }
2565
+ }
2566
+ # endif
2567
+ #endif /* HAVE_HUGE_CODE_PAGES */
2568
+
2483
2569
static int accel_startup (zend_extension * extension )
2484
2570
{
2485
2571
zend_function * func ;
@@ -2505,6 +2591,16 @@ static int accel_startup(zend_extension *extension)
2505
2591
accel_gen_system_id ();
2506
2592
#endif
2507
2593
2594
+ #ifdef HAVE_HUGE_CODE_PAGES
2595
+ if (ZCG (accel_directives ).enable_huge_code_pages &&
2596
+ (strcmp (sapi_module .name , "cli" ) == 0 ||
2597
+ strcmp (sapi_module .name , "cli-server" ) == 0 ||
2598
+ strcmp (sapi_module .name , "cgi-fcgi" ) == 0 ||
2599
+ strcmp (sapi_module .name , "fpm-fcgi" ) == 0 )) {
2600
+ accel_move_code_to_huge_pages ();
2601
+ }
2602
+ #endif
2603
+
2508
2604
/* no supported SAPI found - disable acceleration and stop initialization */
2509
2605
if (accel_find_sapi () == FAILURE ) {
2510
2606
accel_startup_ok = 0 ;
0 commit comments