diff options
author | Rickard Green <rickard@erlang.org> | 2021-10-06 18:29:05 +0200 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2021-10-06 18:29:05 +0200 |
commit | 2f3396278bdbebafe18bd5eb81ea46e2d0e63d91 (patch) | |
tree | a040745d444290ef0fa3bbcf46fcf91d1868f73f | |
parent | b0bc167d55db506e1cd9d79aa767090e93c4be6b (diff) | |
parent | efab76beb0ff9188f5afa04a2242b8f5d68aa1b0 (diff) | |
download | erlang-2f3396278bdbebafe18bd5eb81ea46e2d0e63d91.tar.gz |
Merge branch 'rickard/apply-reds-fix/OTP-17675' into rickard/apply-reds-fix/master/OTP-17675
* rickard/apply-reds-fix/OTP-17675:
HAlloc arguments in apply/fixed_apply instead of GC
Swap out/in reduction count on apply and fixed_apply for GC
-rw-r--r-- | erts/emulator/beam/beam_common.c | 6 | ||||
-rw-r--r-- | erts/emulator/beam/jit/arm/instr_call.cpp | 13 | ||||
-rw-r--r-- | erts/emulator/beam/jit/x86/instr_call.cpp | 8 |
3 files changed, 13 insertions, 14 deletions
diff --git a/erts/emulator/beam/beam_common.c b/erts/emulator/beam/beam_common.c index c9b8dfb51d..0ef3922301 100644 --- a/erts/emulator/beam/beam_common.c +++ b/erts/emulator/beam/beam_common.c @@ -1344,11 +1344,7 @@ apply_setup_error_handler(Process* p, Eterm module, Eterm function, Uint arity, * properly adjusted). */ - if (HeapWordsLeft(p) < sz) { - erts_garbage_collect(p, sz, reg, arity); - } - hp = HEAP_TOP(p); - HEAP_TOP(p) += sz; + hp = HAlloc(p, sz); for (i = arity-1; i >= 0; i--) { args = CONS(hp, reg[i], args); hp += 2; diff --git a/erts/emulator/beam/jit/arm/instr_call.cpp b/erts/emulator/beam/jit/arm/instr_call.cpp index a141ef5fd1..7679ae18ea 100644 --- a/erts/emulator/beam/jit/arm/instr_call.cpp +++ b/erts/emulator/beam/jit/arm/instr_call.cpp @@ -119,7 +119,8 @@ arm::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) { a.bind(entry); - emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs>(3); + emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap | + Update::eXRegs>(3); a.mov(ARG1, c_p); load_x_reg_array(ARG2); @@ -136,7 +137,8 @@ arm::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) { runtime_call<4>(apply); /* Any number of X registers can be live at this point. */ - emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs>(); + emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap | + Update::eXRegs>(); a.cbnz(ARG1, dispatch); emit_raise_exception(entry, &apply3_mfa); @@ -170,8 +172,8 @@ arm::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity, mov_arg(ARG3, Arity); - emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs>( - Arity.getValue() + 2); + emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap | + Update::eXRegs>(Arity.getValue() + 2); a.mov(ARG1, c_p); load_x_reg_array(ARG2); @@ -188,7 +190,8 @@ arm::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity, /* We will need to reload all X registers in case there has been * an error. */ - emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs>(); + emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap | + Update::eXRegs>(); a.cbnz(ARG1, dispatch); emit_raise_exception(entry, &apply3_mfa); diff --git a/erts/emulator/beam/jit/x86/instr_call.cpp b/erts/emulator/beam/jit/x86/instr_call.cpp index 466b184295..968f5bf3de 100644 --- a/erts/emulator/beam/jit/x86/instr_call.cpp +++ b/erts/emulator/beam/jit/x86/instr_call.cpp @@ -152,7 +152,7 @@ x86::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) { align_erlang_cp(); a.bind(entry); - emit_enter_runtime<Update::eStack | Update::eHeap>(); + emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>(); a.mov(ARG1, c_p); load_x_reg_array(ARG2); @@ -167,7 +167,7 @@ x86::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) { runtime_call<4>(apply); - emit_leave_runtime<Update::eStack | Update::eHeap>(); + emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>(); a.test(RET, RET); a.short_().jne(dispatch); @@ -203,7 +203,7 @@ x86::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity, mov_arg(ARG3, Arity); - emit_enter_runtime<Update::eStack | Update::eHeap>(); + emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>(); a.mov(ARG1, c_p); load_x_reg_array(ARG2); @@ -218,7 +218,7 @@ x86::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity, runtime_call<5>(fixed_apply); - emit_leave_runtime<Update::eStack | Update::eHeap>(); + emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>(); a.test(RET, RET); a.short_().jne(dispatch); |