Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:19
erlang
1072-erl_gc-fix-dynamic-tracepoint-for-heap_gro...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1072-erl_gc-fix-dynamic-tracepoint-for-heap_grow.patch of Package erlang
From 562cd9992cd090ff837c79391ec2e5d89219ddf0 Mon Sep 17 00:00:00 2001 From: Maxim Fedorov <dane@whatsapp.com> Date: Tue, 15 Dec 2020 11:10:31 -0800 Subject: [PATCH] erl_gc: fix dynamic tracepoint for heap_grow If stack top is changed before calling heap_grow tracepoint, the stack is not walk-able, because stack bottom points to old heap, while stack top is already reset to new heap. Move tracepoint after all heap references have been updated. Fix warning when compiling with dtrace enabled. --- erts/emulator/beam/erl_gc.c | 51 ++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index 61b4b81668..b74eaccea8 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -697,10 +697,10 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, ErtsMonotonicTime start_time; ErtsSchedulerData *esdp; erts_aint32_t state; - ERTS_MSACC_PUSH_STATE(); #ifdef USE_VM_PROBES DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); #endif + ERTS_MSACC_PUSH_STATE(); ERTS_UNDEF(start_time, 0); ERTS_CHK_MBUF_SZ(p); @@ -1772,15 +1772,6 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end, sys_memcpy(n_heap + new_sz - n, p->stop, n * sizeof(Eterm)); p->stop = n_heap + new_sz - n; -#ifdef USE_VM_PROBES - if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { - DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); - - dtrace_proc_str(p, pidbuf); - DTRACE3(process_heap_grow, pidbuf, HEAP_SIZE(p), new_sz); - } -#endif - #ifdef HARDDEBUG disallow_heap_frag_ref_in_heap(p, n_heap, n_htop); #endif @@ -1789,8 +1780,19 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end, HEAP_START(p) = n_heap; HEAP_TOP(p) = n_htop; - HEAP_SIZE(p) = new_sz; HEAP_END(p) = n_heap + new_sz; + +#ifdef USE_VM_PROBES + if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { + DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); + Uint old_sz = HEAP_SIZE(p); + + HEAP_SIZE(p) = new_sz; + dtrace_proc_str(p, pidbuf); + DTRACE3(process_heap_grow, pidbuf, old_sz, new_sz); + } +#endif + HEAP_SIZE(p) = new_sz; } /* @@ -1863,15 +1865,6 @@ major_collection(Process* p, ErlHeapFragment *live_hf_end, sys_memcpy(n_heap + new_sz - stk_sz, p->stop, stk_sz * sizeof(Eterm)); p->stop = n_heap + new_sz - stk_sz; -#ifdef USE_VM_PROBES - if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { - DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); - - dtrace_proc_str(p, pidbuf); - DTRACE3(process_heap_grow, pidbuf, HEAP_SIZE(p), new_sz); - } -#endif - #ifdef HARDDEBUG disallow_heap_frag_ref_in_heap(p, n_heap, n_htop); #endif @@ -1880,8 +1873,24 @@ major_collection(Process* p, ErlHeapFragment *live_hf_end, HEAP_START(p) = n_heap; HEAP_TOP(p) = n_htop; - HEAP_SIZE(p) = new_sz; HEAP_END(p) = n_heap + new_sz; + +#ifdef USE_VM_PROBES + /* Fire process_heap_grow tracepoint after all heap references have + * been updated. This allows to walk the stack. */ + if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { + DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); + Uint old_sz = HEAP_SIZE(p); + + /* Update the heap size before firing tracepoint */ + HEAP_SIZE(p) = new_sz; + + dtrace_proc_str(p, pidbuf); + DTRACE3(process_heap_grow, pidbuf, old_sz, new_sz); + } +#endif + HEAP_SIZE(p) = new_sz; + GEN_GCS(p) = 0; HIGH_WATER(p) = HEAP_TOP(p); -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor