]> granicus.if.org Git - php/commitdiff
JIT support for opcache restart
authorDmitry Stogov <dmitry@zend.com>
Wed, 8 Jul 2020 15:14:11 +0000 (18:14 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 8 Jul 2020 15:14:11 +0000 (18:14 +0300)
ext/opcache/ZendAccelerator.c
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit.h
ext/opcache/jit/zend_jit_trace.c

index 23889327a7a14a1595b3a8335466c9c48feca5eb..073b3c8b58901a07a878a52c433e7b80a96a0bed 100644 (file)
@@ -2506,6 +2506,11 @@ int accel_activate(INIT_FUNC_ARGS)
                                if (ZCSG(preload_script)) {
                                        preload_restart();
                                }
+
+#ifdef HAVE_JIT
+                               zend_jit_restart();
+#endif
+
                                ZCSG(accelerator_enabled) = ZCSG(cache_status_before_restart);
                                if (ZCSG(last_restart_time) < ZCG(request_time)) {
                                        ZCSG(last_restart_time) = ZCG(request_time);
index debf4df866a6c57784990827b17c6f4c1957aad7..478244b6d736186f744e041082444f3a796d04bf 100644 (file)
@@ -3798,7 +3798,7 @@ ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, zend_bool reattached)
        }
 #endif
 
-       dasm_ptr = dasm_end = (void*)(((char*)dasm_buf) + size - sizeof(*dasm_ptr));
+       dasm_ptr = dasm_end = (void*)(((char*)dasm_buf) + size - sizeof(*dasm_ptr) * 2);
        if (!reattached) {
                zend_jit_unprotect();
                *dasm_ptr = dasm_buf;
@@ -3847,6 +3847,11 @@ ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, zend_bool reattached)
                return FAILURE;
        }
 
+       /* save JIT buffer pos */
+       zend_jit_unprotect();
+       dasm_ptr[1] = dasm_ptr[0];
+       zend_jit_protect();
+
        return SUCCESS;
 }
 
@@ -3926,4 +3931,18 @@ ZEND_EXT_API void zend_jit_deactivate(void)
        }
 }
 
+ZEND_EXT_API void zend_jit_restart(void)
+{
+       if (dasm_buf) {
+               zend_jit_unprotect();
+
+               /* restore JIT buffer pos */
+               dasm_ptr[0] = dasm_ptr[1];
+
+               zend_jit_trace_restart();
+
+               zend_jit_protect();
+       }
+}
+
 #endif /* HAVE_JIT */
index 406e0edece0044f0a3c79bc2e43f46226d0eec1b..49150a62ae4866ccd2271fc1c94550a37e3ce3bc 100644 (file)
@@ -140,6 +140,7 @@ ZEND_EXT_API void zend_jit_shutdown(void);
 ZEND_EXT_API void zend_jit_activate(void);
 ZEND_EXT_API void zend_jit_deactivate(void);
 ZEND_EXT_API void zend_jit_status(zval *ret);
+ZEND_EXT_API void zend_jit_restart(void);
 
 typedef struct _zend_lifetime_interval zend_lifetime_interval;
 typedef struct _zend_life_range zend_life_range;
index 8516353902ac5ff583ac6b28179e31e069586d9c..7a0e6fbcc2a8095f6740eef2c4e4b3d8b96806e7 100644 (file)
@@ -5606,3 +5606,13 @@ static void zend_jit_trace_init_caches(void)
 static void zend_jit_trace_reset_caches(void)
 {
 }
+
+static void zend_jit_trace_restart(void)
+{
+       ZEND_JIT_TRACE_NUM = 1;
+       ZEND_JIT_COUNTER_NUM = 0;
+       ZEND_JIT_EXIT_NUM = 0;
+       ZEND_JIT_EXIT_COUNTERS = 0;
+
+       zend_jit_trace_init_caches();
+}