@@ -40,6 +40,33 @@ static int create_segments(size_t requested_size, zend_shared_segment_posix ***s
40
40
{
41
41
zend_shared_segment_posix * shared_segment ;
42
42
char shared_segment_name [sizeof ("/ZendAccelerator." ) + 20 ];
43
+ int shared_segment_flags = O_RDWR |O_CREAT |O_TRUNC ;
44
+ mode_t shared_segment_mode = 0600 ;
45
+
46
+ #if defined(HAVE_SHM_CREATE_LARGEPAGE )
47
+ /**
48
+ * architectures have 3 entries max and we are interested
49
+ * from the second offset minimum to be worthy creating
50
+ * a special shared segment tagged as 'large'.
51
+ * only then amd64/i386/arm64 and perharps risc64*
52
+ * archs are on interest here.
53
+ */
54
+ size_t i , shared_segment_sizes = 0 , shared_segment_lg_index = 0 ;
55
+ size_t shared_segment_sindexes [3 ] = {0 };
56
+ const size_t entries = sizeof (shared_segment_sindexes ) / sizeof (shared_segment_sindexes [0 ]);
57
+
58
+ shared_segment_sizes = getpagesizes (shared_segment_sindexes , entries );
59
+
60
+ if (shared_segment_sizes > 0 ) {
61
+ for (i = shared_segment_sizes - 1 ; i >= 0 ; i -- ) {
62
+ if (shared_segment_sindexes [i ] != 0 &&
63
+ !(requested_size % shared_segment_sindexes [i ])) {
64
+ shared_segment_lg_index = i ;
65
+ break ;
66
+ }
67
+ }
68
+ }
69
+ #endif
43
70
44
71
* shared_segments_count = 1 ;
45
72
* shared_segments_p = (zend_shared_segment_posix * * ) calloc (1 , sizeof (zend_shared_segment_posix ) + sizeof (void * ));
@@ -51,12 +78,24 @@ static int create_segments(size_t requested_size, zend_shared_segment_posix ***s
51
78
(* shared_segments_p )[0 ] = shared_segment ;
52
79
53
80
sprintf (shared_segment_name , "/ZendAccelerator.%d" , getpid ());
54
- shared_segment -> shm_fd = shm_open (shared_segment_name , O_RDWR |O_CREAT |O_TRUNC , 0600 );
81
+ #if defined(HAVE_SHM_CREATE_LARGEPAGE )
82
+ if (shared_segment_lg_index > 0 ) {
83
+ shared_segment -> shm_fd = shm_create_largepage (shared_segment_name , shared_segment_flags , shared_segment_lg_index , SHM_LARGEPAGE_ALLOC_DEFAULT , shared_segment_mode );
84
+ if (shared_segment -> shm_fd != -1 ) {
85
+ goto truncate_segment ;
86
+ }
87
+ }
88
+ #endif
89
+
90
+ shared_segment -> shm_fd = shm_open (shared_segment_name , shared_segment_flags , shared_segment_mode );
55
91
if (shared_segment -> shm_fd == -1 ) {
56
92
* error_in = "shm_open" ;
57
93
return ALLOC_FAILURE ;
58
94
}
59
95
96
+ #if defined(HAVE_SHM_CREATE_LARGEPAGE )
97
+ truncate_segment :
98
+ #endif
60
99
if (ftruncate (shared_segment -> shm_fd , requested_size ) != 0 ) {
61
100
* error_in = "ftruncate" ;
62
101
shm_unlink (shared_segment_name );
0 commit comments