]> granicus.if.org Git - php/commitdiff
Fix opcache huge page mapping on FreeBSD
authorDavid Carlier <devnexen@gmail.com>
Mon, 1 Jul 2019 19:23:02 +0000 (20:23 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 2 Jul 2019 09:59:08 +0000 (11:59 +0200)
Too much room were given process mappings and were not unmapped.

Closes GH-4345.

ext/opcache/ZendAccelerator.c

index 8973b2844d429716676f4952e9fca34269d978d0..5b49159421d9da880e0717a706d629a28cadd5c9 100644 (file)
@@ -2745,9 +2745,9 @@ static void accel_move_code_to_huge_pages(void)
        size_t s = 0;
        int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()};
        long unsigned int huge_page_size = 2 * 1024 * 1024;
-       if(sysctl(mib, 4, NULL, &s, NULL, 0) == 0) {
+       if (sysctl(mib, 4, NULL, &s, NULL, 0) == 0) {
                s = s * 4 / 3;
-               void *addr = mmap(NULL, s * sizeof (struct kinfo_vmentry), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
+               void *addr = mmap(NULL, s, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
                if (addr != MAP_FAILED) {
                        if (sysctl(mib, 4, addr, &s, NULL, 0) == 0) {
                                uintptr_t start = (uintptr_t)addr;
@@ -2766,11 +2766,14 @@ static void accel_move_code_to_huge_pages(void)
                                                if (seg_end > seg_start) {
                                                        zend_accel_error(ACCEL_LOG_DEBUG, "remap to huge page %lx-%lx %s \n", seg_start, seg_end, entry->kve_path);
                                                        accel_remap_huge_pages((void*)seg_start, seg_end - seg_start, seg_end - seg_start, entry->kve_path, entry->kve_offset + seg_start - start);
+                                                       // First relevant segment found is our binary
+                                                       break;
                                                }
                                        }
                                        start += sz;
                                }
                        }
+                       munmap(addr, s);
                }
        }
 #endif