Skip to content

Commit b4e7420

Browse files
committed
opcache posix creating special shared segments for FreeBSD 13 and above.
From this release, it is permitted to create shared memory blocks tagged as large for faster accesses for a size compatible with otherwise we fallback to a classic creation.
1 parent d4e24e7 commit b4e7420

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

ext/opcache/config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ if test "$PHP_OPCACHE" != "no"; then
105105

106106
fi
107107

108-
AC_CHECK_FUNCS([mprotect])
108+
AC_CHECK_FUNCS([mprotect shm_create_largepage])
109109

110110
AC_MSG_CHECKING(for sysvipc shared memory support)
111111
AC_RUN_IFELSE([AC_LANG_SOURCE([[

ext/opcache/shared_alloc_posix.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,33 @@ static int create_segments(size_t requested_size, zend_shared_segment_posix ***s
4040
{
4141
zend_shared_segment_posix *shared_segment;
4242
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
4370

4471
*shared_segments_count = 1;
4572
*shared_segments_p = (zend_shared_segment_posix **) calloc(1, sizeof(zend_shared_segment_posix) + sizeof(void *));
@@ -51,7 +78,12 @@ static int create_segments(size_t requested_size, zend_shared_segment_posix ***s
5178
(*shared_segments_p)[0] = shared_segment;
5279

5380
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+
shared_segment->shm_fd =
82+
#if defined(HAVE_SHM_CREATE_LARGEPAGE)
83+
shared_segment_lg_index > 0 ?
84+
shm_create_largepage(shared_segment_name, shared_segment_flags, shared_segment_lg_index, SHM_LARGEPAGE_ALLOC_DEFAULT, shared_segment_mode) :
85+
#endif
86+
shm_open(shared_segment_name, shared_segment_flags, shared_segment_mode);
5587
if (shared_segment->shm_fd == -1) {
5688
*error_in = "shm_open";
5789
return ALLOC_FAILURE;

0 commit comments

Comments
 (0)