From 18a0950b13bb1e02f8f6a328e462250df5f32c0e Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 14:43:52 +0300 Subject: [PATCH 01/14] Keep only MACOS ZTS tests --- .github/workflows/push.yml | 133 +------------------------------------ 1 file changed, 3 insertions(+), 130 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 52a323c58148..e84edb5dce9f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -145,7 +145,7 @@ jobs: - name: Verify generated files are up to date if: ${{ !matrix.asan }} uses: ./.github/actions/verify-generated-files - MACOS_DEBUG_NTS: + MACOS_DEBUG_ZTS: if: github.repository_owner == 'php' || github.event_name == 'pull_request' strategy: fail-fast: false @@ -155,7 +155,7 @@ jobs: arch: X64 - os: 14 arch: ARM64 - name: MACOS_${{ matrix.arch }}_DEBUG_NTS + name: MACOS_${{ matrix.arch }}_DEBUG_ZTS runs-on: macos-${{ matrix.os }} steps: - name: git checkout @@ -170,7 +170,7 @@ jobs: - name: ./configure uses: ./.github/actions/configure-macos with: - configurationParameters: --enable-debug --disable-zts + configurationParameters: --enable-debug --enable-zts - name: make run: |- export PATH="$(brew --prefix)/opt/bison/bin:$PATH" @@ -187,130 +187,3 @@ jobs: -d opcache.enable_cli=1 - name: Verify generated files are up to date uses: ./.github/actions/verify-generated-files - WINDOWS: - if: github.repository_owner == 'php' || github.event_name == 'pull_request' - name: WINDOWS_X64_ZTS - runs-on: windows-2019 - env: - PHP_BUILD_CACHE_BASE_DIR: C:\build-cache - PHP_BUILD_OBJ_DIR: C:\obj - PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk - PHP_BUILD_SDK_BRANCH: php_downloads_server_migration_v1 - PHP_BUILD_CRT: vs16 - PLATFORM: x64 - THREAD_SAFE: "1" - INTRINSICS: AVX2 - PARALLEL: -j2 - OPCACHE: "1" - steps: - - name: git config - run: git config --global core.autocrlf false && git config --global core.eol lf - - name: git checkout - uses: actions/checkout@v4 - - name: Setup - uses: ./.github/actions/setup-windows - - name: Build - run: .github/scripts/windows/build.bat - - name: Test - run: .github/scripts/windows/test.bat - BENCHMARKING: - name: BENCHMARKING - if: github.repository_owner == 'php' || github.event_name == 'pull_request' - runs-on: ubuntu-22.04 - steps: - - name: git checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: apt - run: | - set -x - sudo apt-get update - sudo apt-get install \ - bison \ - libgmp-dev \ - libonig-dev \ - libsqlite3-dev \ - openssl \ - re2c \ - valgrind - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: "${{github.job}}-${{hashFiles('main/php_version.h')}}" - append-timestamp: false - - name: ./configure - run: | - set -x - ./buildconf --force - ./configure \ - --disable-debug \ - --enable-mbstring \ - --enable-opcache \ - --enable-option-checking=fatal \ - --enable-sockets \ - --enable-werror \ - --prefix=/usr \ - --with-config-file-scan-dir=/etc/php.d \ - --with-gmp \ - --with-mysqli=mysqlnd \ - --with-openssl \ - --with-pdo-sqlite \ - --with-valgrind - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - run: | - set -x - sudo make install - sudo mkdir -p /etc/php.d - sudo chmod 777 /etc/php.d - echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini - echo zend_extension=opcache.so >> /etc/php.d/opcache.ini - echo opcache.enable=1 >> /etc/php.d/opcache.ini - echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini - - name: Setup - run: | - git config --global user.name "Benchmark" - git config --global user.email "benchmark@php.net" - sudo service mysql start - mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS wordpress" - mysql -uroot -proot -e "CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress'; FLUSH PRIVILEGES;" - mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION;" - - name: git checkout benchmarking-data - uses: actions/checkout@v4 - with: - repository: php/benchmarking-data - ssh-key: ${{ secrets.BENCHMARKING_DATA_DEPLOY_KEY }} - path: benchmark/repos/data - - name: Benchmark - run: php benchmark/benchmark.php true - - name: Store result - if: github.event_name == 'push' - run: | - set -x - cd benchmark/repos/data - git pull --autostash - if [ -e ".git/MERGE_HEAD" ]; then - echo "Merging, can't proceed" - exit 1 - fi - git add . - if git diff --cached --quiet; then - exit 0 - fi - git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}" - git push - - name: Show diff - if: github.event_name == 'pull_request' - run: |- - set -x - php benchmark/generate_diff.php \ - ${{ github.sha }} \ - $(git merge-base ${{ github.event.pull_request.base.sha }} ${{ github.sha }}) \ - > $GITHUB_STEP_SUMMARY - - uses: actions/upload-artifact@v4 - with: - name: profiles - path: ${{ github.workspace }}/benchmark/profiles - retention-days: 30 From d10e45d834d4192868d9f89ae2925fdcc4195029 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 15:06:26 +0300 Subject: [PATCH 02/14] MAP_JIT should be passed to mmap() flags --- ext/opcache/shared_alloc_mmap.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index d5e4612bc104..245551c5e826 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -180,6 +180,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ { zend_shared_segment *shared_segment; int flags = PROT_READ | PROT_WRITE, fd = -1; + int mmap_flags = MAP_SHARED | MAP_ANONYMOUS; void *p; #if defined(HAVE_PROCCTL) && defined(PROC_WXMAP_CTL) int enable_wxmap = PROC_WX_MAPPINGS_PERMIT; @@ -198,7 +199,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif #ifdef MAP_JIT - flags |= MAP_JIT; + mmap_flags |= MAP_JIT; #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) void *hint = find_prefered_mmap_base(requested_size); @@ -206,13 +207,13 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ # ifdef MAP_HUGETLB size_t huge_page_size = 2 * 1024 * 1024; if (requested_size >= huge_page_size && requested_size % huge_page_size == 0) { - p = mmap(hint, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB|MAP_FIXED, -1, 0); + p = mmap(hint, requested_size, flags, mmap_flags|MAP_HUGETLB|MAP_FIXED, -1, 0); if (p != MAP_FAILED) { goto success; } } #endif - p = mmap(hint, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_FIXED, -1, 0); + p = mmap(hint, requested_size, flags, mmap_flags|MAP_FIXED, -1, 0); if (p != MAP_FAILED) { goto success; } @@ -236,34 +237,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ /* to got HUGE PAGES in low 32-bit address we have to reserve address space and then remap it using MAP_HUGETLB */ - p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0); + p = mmap(NULL, requested_size, flags, mmap_flags|MAP_32BIT, fd, 0); if (p != MAP_FAILED) { munmap(p, requested_size); p = (void*)(ZEND_MM_ALIGNED_SIZE_EX((ptrdiff_t)p, huge_page_size)); - p = mmap(p, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0); + p = mmap(p, requested_size, flags, mmap_flags|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0); if (p != MAP_FAILED) { goto success; } else { - p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0); + p = mmap(NULL, requested_size, flags, mmap_flags|MAP_32BIT, fd, 0); if (p != MAP_FAILED) { goto success; } } } # endif - p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, fd, 0); + p = mmap(0, requested_size, flags, mmap_flags|MAP_HUGETLB, fd, 0); if (p != MAP_FAILED) { goto success; } } #elif defined(PREFER_MAP_32BIT) && defined(__x86_64__) && defined(MAP_32BIT) - p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0); + p = mmap(NULL, requested_size, flags, mmap_flags|MAP_32BIT, fd, 0); if (p != MAP_FAILED) { goto success; } #endif - p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, fd, 0); + p = mmap(0, requested_size, flags, mmap_flags, fd, 0); if (p == MAP_FAILED) { *error_in = "mmap"; return ALLOC_FAILURE; From 52e8b636eef267221276e47b448197716ccc35eb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 15:23:33 +0300 Subject: [PATCH 03/14] Macos/Arm64 should use pthread_jit_write_protect_np() instead of mprotect() --- ext/opcache/jit/zend_jit.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 294ed1db8eaf..a012d174534f 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3196,6 +3196,7 @@ ZEND_EXT_API void zend_jit_unprotect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(0); + return; } #endif opts |= PROT_EXEC; @@ -3229,6 +3230,7 @@ ZEND_EXT_API void zend_jit_protect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); + return; } #endif if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { From 8154cca196c11cfb27d6de4e15ac398e0527d8ca Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 15:44:34 +0300 Subject: [PATCH 04/14] Macos/Arm64 should use pthread_jit_write_protect_np() instead of mprotect() --- ext/opcache/jit/zend_jit.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a012d174534f..454afde9aac1 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3465,10 +3465,12 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) dasm_size = size; dasm_ptr = dasm_end = (void*)(((char*)dasm_buf) + size - sizeof(*dasm_ptr) * 2); + do { #ifdef HAVE_MPROTECT #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); + break; } #endif if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { @@ -3501,6 +3503,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) } } #endif + } while (0); if (!reattached) { zend_jit_unprotect(); From 12660112cbf43682a904d7daeedb34d22e3886d7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 16:03:22 +0300 Subject: [PATCH 05/14] Ignore pthread_jit_write_protect_supported_np() --- ext/opcache/jit/zend_jit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 454afde9aac1..da1c3d66dfcb 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3458,7 +3458,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) zend_jit_profile_counter_rid = zend_get_op_array_extension_handle(ACCELERATOR_PRODUCT_NAME); #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP - zend_write_protect = pthread_jit_write_protect_supported_np(); +// zend_write_protect = pthread_jit_write_protect_supported_np(); #endif dasm_buf = buf; From 2a24b1b9c5373f6119f9588cead0402e02a74490 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 16:17:54 +0300 Subject: [PATCH 06/14] Temporary run tests without "-d opcache.protect_memory=1" --- .github/actions/test-macos/action.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/test-macos/action.yml b/.github/actions/test-macos/action.yml index 029ca2edb966..017cef9f74c3 100644 --- a/.github/actions/test-macos/action.yml +++ b/.github/actions/test-macos/action.yml @@ -21,7 +21,6 @@ runs: export STACK_LIMIT_DEFAULTS_CHECK=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ -d opcache.jit=${{ inputs.jitType }} \ - -d opcache.protect_memory=1 \ -d opcache.jit_buffer_size=64M \ -j$(($(sysctl -n hw.ncpu) - 1)) \ -g FAIL,BORK,LEAK,XLEAK \ From 78688a9a7d0f99bffdc2ea0789e34cbef3706628 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 16:29:28 +0300 Subject: [PATCH 07/14] Try to ignore mprotect() failure --- .github/actions/test-macos/action.yml | 1 + ext/opcache/jit/zend_jit.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/actions/test-macos/action.yml b/.github/actions/test-macos/action.yml index 017cef9f74c3..029ca2edb966 100644 --- a/.github/actions/test-macos/action.yml +++ b/.github/actions/test-macos/action.yml @@ -21,6 +21,7 @@ runs: export STACK_LIMIT_DEFAULTS_CHECK=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ -d opcache.jit=${{ inputs.jitType }} \ + -d opcache.protect_memory=1 \ -d opcache.jit_buffer_size=64M \ -j$(($(sysctl -n hw.ncpu) - 1)) \ -g FAIL,BORK,LEAK,XLEAK \ diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index da1c3d66dfcb..0a409cae3001 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3196,13 +3196,14 @@ ZEND_EXT_API void zend_jit_unprotect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(0); - return; } #endif opts |= PROT_EXEC; #endif if (mprotect(dasm_buf, dasm_size, opts) != 0) { +#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); +#endif } } #elif _WIN32 @@ -3230,11 +3231,12 @@ ZEND_EXT_API void zend_jit_protect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); - return; } #endif if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { +#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); +#endif } } #elif _WIN32 @@ -3465,21 +3467,23 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) dasm_size = size; dasm_ptr = dasm_end = (void*)(((char*)dasm_buf) + size - sizeof(*dasm_ptr) * 2); - do { #ifdef HAVE_MPROTECT #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); - break; } #endif if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { +#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); +#endif } } else { if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { +#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); +#endif } } #elif _WIN32 @@ -3503,7 +3507,6 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) } } #endif - } while (0); if (!reattached) { zend_jit_unprotect(); From 497cf4aa5b0a3b6233038945121783b3794de0d2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 17:11:43 +0300 Subject: [PATCH 08/14] Try removing MAP_JIT --- ext/opcache/jit/zend_jit.c | 7 ++++++- ext/opcache/shared_alloc_mmap.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 0a409cae3001..5962b3e38567 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3196,6 +3196,7 @@ ZEND_EXT_API void zend_jit_unprotect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(0); + return; } #endif opts |= PROT_EXEC; @@ -3231,6 +3232,7 @@ ZEND_EXT_API void zend_jit_protect(void) #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); + return; } #endif if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { @@ -3460,17 +3462,19 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) zend_jit_profile_counter_rid = zend_get_op_array_extension_handle(ACCELERATOR_PRODUCT_NAME); #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP -// zend_write_protect = pthread_jit_write_protect_supported_np(); + zend_write_protect = 0;//pthread_jit_write_protect_supported_np(); #endif dasm_buf = buf; dasm_size = size; dasm_ptr = dasm_end = (void*)(((char*)dasm_buf) + size - sizeof(*dasm_ptr) * 2); + do { #ifdef HAVE_MPROTECT #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(1); + break; } #endif if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { @@ -3507,6 +3511,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) } } #endif + } while (0); if (!reattached) { zend_jit_unprotect(); diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index 245551c5e826..0e7a3662a6fe 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -199,7 +199,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif #ifdef MAP_JIT - mmap_flags |= MAP_JIT; +// mmap_flags |= MAP_JIT; #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) void *hint = find_prefered_mmap_base(requested_size); From 4e2c6b6f4a6e91e1d9a6a9673bff99557f462509 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 17:34:30 +0300 Subject: [PATCH 09/14] Yet another attempt --- ext/opcache/jit/zend_jit.c | 10 +--------- ext/opcache/shared_alloc_mmap.c | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 5962b3e38567..454afde9aac1 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3202,9 +3202,7 @@ ZEND_EXT_API void zend_jit_unprotect(void) opts |= PROT_EXEC; #endif if (mprotect(dasm_buf, dasm_size, opts) != 0) { -#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); -#endif } } #elif _WIN32 @@ -3236,9 +3234,7 @@ ZEND_EXT_API void zend_jit_protect(void) } #endif if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { -#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); -#endif } } #elif _WIN32 @@ -3462,7 +3458,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) zend_jit_profile_counter_rid = zend_get_op_array_extension_handle(ACCELERATOR_PRODUCT_NAME); #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP - zend_write_protect = 0;//pthread_jit_write_protect_supported_np(); + zend_write_protect = pthread_jit_write_protect_supported_np(); #endif dasm_buf = buf; @@ -3479,15 +3475,11 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) #endif if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { -#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); -#endif } } else { if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { -#ifndef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); -#endif } } #elif _WIN32 diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index 0e7a3662a6fe..245551c5e826 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -199,7 +199,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif #ifdef MAP_JIT -// mmap_flags |= MAP_JIT; + mmap_flags |= MAP_JIT; #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) void *hint = find_prefered_mmap_base(requested_size); From 7eaab5f08f6f592fa56aa866d4eededb7b976f42 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 17:56:22 +0300 Subject: [PATCH 10/14] Set MAP_JIT only for Apple silicon --- ext/opcache/shared_alloc_mmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index 245551c5e826..c4be0a1a780e 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -198,7 +198,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ #ifdef PROT_MAX flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif -#ifdef MAP_JIT +#if defined(MAP_JIT) && defined(__APPLE__) && defined(__aarch64__) mmap_flags |= MAP_JIT; #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) From 26b28c1b458162f7751e6602ab3b7e04ada33f6b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 19:11:14 +0300 Subject: [PATCH 11/14] An attempt to support environment where pthread_jit_write_protect_supported_np() returns false --- ext/opcache/ZendAccelerator.c | 3 +++ ext/opcache/jit/zend_jit.c | 6 ++++++ ext/opcache/shared_alloc_mmap.c | 5 ++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index b9149fa1fa12..f161389bd6b6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3206,6 +3206,9 @@ static zend_result accel_post_startup(void) switch (zend_shared_alloc_startup(shm_size, 0)) { #endif case ALLOC_SUCCESS: +#if defined(ZTS) && defined(__APPLE__) && defined(__aarch64__) + zend_accel_shared_protect(0); +#endif if (zend_accel_init_shm() == FAILURE) { accel_startup_ok = false; return FAILURE; diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 454afde9aac1..4f3331dfadac 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3201,9 +3201,11 @@ ZEND_EXT_API void zend_jit_unprotect(void) #endif opts |= PROT_EXEC; #endif +#if !defined(ZTS) || !defined(__APPLE__) || !defined(__aarch64__) if (mprotect(dasm_buf, dasm_size, opts) != 0) { fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); } +#endif } #elif _WIN32 if (!(JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP))) { @@ -3233,9 +3235,11 @@ ZEND_EXT_API void zend_jit_protect(void) return; } #endif +#if !defined(ZTS) || !defined(__APPLE__) || !defined(__aarch64__) if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_EXEC) != 0) { fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); } +#endif } #elif _WIN32 if (!(JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP))) { @@ -3473,6 +3477,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) break; } #endif +#if !defined(ZTS) || !defined(__APPLE__) || !defined(__aarch64__) if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { if (mprotect(dasm_buf, dasm_size, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); @@ -3482,6 +3487,7 @@ ZEND_EXT_API void zend_jit_startup(void *buf, size_t size, bool reattached) fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); } } +#endif #elif _WIN32 if (JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP)) { DWORD old; diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index c4be0a1a780e..b212becb7e50 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -198,7 +198,10 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ #ifdef PROT_MAX flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif -#if defined(MAP_JIT) && defined(__APPLE__) && defined(__aarch64__) +#if defined(ZTS) && defined(__APPLE__) && defined(__aarch64__) + flags |= PROT_EXEC; +#endif +#ifdef MAP_JIT mmap_flags |= MAP_JIT; #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) From f108d9c3907095cb468d1d192f33c22e7d14d6a5 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 19:22:20 +0300 Subject: [PATCH 12/14] Fix build --- ext/opcache/jit/zend_jit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 4f3331dfadac..a078d1d7618c 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3191,17 +3191,17 @@ ZEND_EXT_API void zend_jit_unprotect(void) { #ifdef HAVE_MPROTECT if (!(JIT_G(debug) & (ZEND_JIT_DEBUG_GDB|ZEND_JIT_DEBUG_PERF_DUMP))) { - int opts = PROT_READ | PROT_WRITE; -#ifdef ZTS #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP if (zend_write_protect) { pthread_jit_write_protect_np(0); return; } #endif +#if !defined(ZTS) || !defined(__APPLE__) || !defined(__aarch64__) + int opts = PROT_READ | PROT_WRITE; +#ifdef ZTS opts |= PROT_EXEC; #endif -#if !defined(ZTS) || !defined(__APPLE__) || !defined(__aarch64__) if (mprotect(dasm_buf, dasm_size, opts) != 0) { fprintf(stderr, "mprotect() failed [%d] %s\n", errno, strerror(errno)); } From 97318fcd93d469eb97987db3a2e7ffc92a4140e2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 19:45:46 +0300 Subject: [PATCH 13/14] Yet another attempt --- ext/opcache/ZendAccelerator.c | 3 --- ext/opcache/shared_alloc_mmap.c | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index f161389bd6b6..b9149fa1fa12 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3206,9 +3206,6 @@ static zend_result accel_post_startup(void) switch (zend_shared_alloc_startup(shm_size, 0)) { #endif case ALLOC_SUCCESS: -#if defined(ZTS) && defined(__APPLE__) && defined(__aarch64__) - zend_accel_shared_protect(0); -#endif if (zend_accel_init_shm() == FAILURE) { accel_startup_ok = false; return FAILURE; diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index b212becb7e50..9b15743a863d 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -48,6 +48,10 @@ # define MAP_HUGETLB MAP_ALIGNED_SUPER #endif +#ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP +#include +#endif + #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) static void *find_prefered_mmap_base(size_t requested_size) { @@ -198,11 +202,18 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ #ifdef PROT_MAX flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC); #endif +#ifdef MAP_JIT +# ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP + if (pthread_jit_write_protect_supported_np()) { + mmap_flags |= MAP_JIT; + } else { #if defined(ZTS) && defined(__APPLE__) && defined(__aarch64__) - flags |= PROT_EXEC; + flags |= PROT_EXEC; #endif -#ifdef MAP_JIT + } +# else mmap_flags |= MAP_JIT; +# endif #endif #if (defined(__linux__) || defined(__FreeBSD__)) && (defined(__x86_64__) || defined (__aarch64__)) && !defined(__SANITIZE_ADDRESS__) void *hint = find_prefered_mmap_base(requested_size); From 13f32d6e9a9ec23969da7b84fbe67faafd515b4f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 Feb 2024 20:16:35 +0300 Subject: [PATCH 14/14] Remove "-d opcache.protect_memory=1" --- .github/actions/test-macos/action.yml | 1 - .github/workflows/push.yml | 3 --- 2 files changed, 4 deletions(-) diff --git a/.github/actions/test-macos/action.yml b/.github/actions/test-macos/action.yml index 029ca2edb966..017cef9f74c3 100644 --- a/.github/actions/test-macos/action.yml +++ b/.github/actions/test-macos/action.yml @@ -21,7 +21,6 @@ runs: export STACK_LIMIT_DEFAULTS_CHECK=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ -d opcache.jit=${{ inputs.jitType }} \ - -d opcache.protect_memory=1 \ -d opcache.jit_buffer_size=64M \ -j$(($(sysctl -n hw.ncpu) - 1)) \ -g FAIL,BORK,LEAK,XLEAK \ diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index e84edb5dce9f..5c431903cf43 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -76,9 +76,6 @@ jobs: - debug: false zts: false asan: false - - debug: true - zts: true - asan: true name: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}" runs-on: ubuntu-22.04 steps: