Skip to content

Commit 6a8260a

Browse files
devnexennikic
authored andcommitted
opcache/FreeBSD huge code page pragma support
Sort of following up on super pages support earlier, here we also detect page mappings possibly eligible to go to super pages.
1 parent a453619 commit 6a8260a

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2624,6 +2624,12 @@ static void accel_gen_system_id(void)
26242624
# ifndef MAP_FAILED
26252625
# define MAP_FAILED ((void*)-1)
26262626
# 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
26272633
# endif
26282634

26292635
# 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
26892695

26902696
static void accel_move_code_to_huge_pages(void)
26912697
{
2698+
#if defined(__linux__)
26922699
FILE *f;
26932700
long unsigned int huge_page_size = 2 * 1024 * 1024;
26942701

@@ -2710,6 +2717,39 @@ static void accel_move_code_to_huge_pages(void)
27102717
}
27112718
fclose(f);
27122719
}
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
27132753
}
27142754
# else
27152755
static void accel_move_code_to_huge_pages(void)

ext/opcache/shared_alloc_mmap.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
3333
# define MAP_ANONYMOUS MAP_ANON
3434
#endif
35+
#if defined(MAP_ALIGNED_SUPER)
36+
# define MAP_HUGETLB MAP_ALIGNED_SUPER
37+
#endif
3538

3639
static int create_segments(size_t requested_size, zend_shared_segment ***shared_segments_p, int *shared_segments_count, char **error_in)
3740
{
@@ -48,10 +51,14 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
4851

4952
#ifdef MAP_HUGETLB
5053
/* Try to allocate huge pages first to reduce dTLB misses.
51-
* OS has to be configured properly
54+
* OSes has to be configured properly
55+
* on Linux
5256
* (e.g. https://wiki.debian.org/Hugepages#Enabling_HugeTlbPage)
5357
* You may verify huge page usage with the following command:
5458
* `grep "Huge" /proc/meminfo`
59+
* on FreeBSD
60+
* sysctl vm.pmap.pg_ps_enabled entry
61+
* (boot time config only, but enabled by default on most arches).
5562
*/
5663
shared_segment->p = mmap(0, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
5764
if (shared_segment->p != MAP_FAILED) {

0 commit comments

Comments
 (0)