aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
AgeCommit message (Collapse)Author
2019-08-22Merge branch 'maint'Sverker Eriksson
2019-08-22Merge branch 'sverker/ets-delete-tree-trapping' into maintSverker Eriksson
* sverker/ets-delete-tree-trapping: erts: Refactor ets catree deletion
2019-08-22Merge pull request #2351 from bjorng/bjorn/erts/optimize-cp-management/OTP-15077Björn Gustavsson
Optimize continuation pointer management
2019-08-22Optimize the move_call instructionsBjörn Gustavsson
The `move_call` instructions are combinations of a `move` instruction and a `call` instruction. As currently implemented, the `move` part of the instruction is executed in its entirety before the `call` part is even started. The reason is that the C compiler cannot see that it would be safe to read the target address of the call before writing to the move destination. Rewrite the instructions to explicitly read both the source for the move and the target address for the call before writing the destination of the move. Micro-benchmarks show a small but consistent speed-up after this change.
2019-08-22Optimize deallocate_return instructionsBjörn Gustavsson
Eliminating the CP register and putting continuation pointers directly on the stack made the deallocate_return instruction slower. Try to mitigate this slow down by specializing deallocate_return for small stack. For the move_deallocate_return instruction, reorder instructions to make it possible to execute the read instructions in parallel.
2019-08-22Optimize continuation pointer managementBjörn Gustavsson
The BEAM instructions for calling a function don't save the continuation pointer (return address) on the stack, but to a special BEAM register called CP. It is the responsibility of the called function to save CP to the stack frame before calling other functions. In the earlier implementations of BEAM on Sparc, CP was located in a CPU register. That meant that the continuation pointer was never written to memory when calling simple functions that didn't call other functions at all or ended in a tail-call to another function. The modern BEAM no longer keeps CP in CPU register. Instead, it is kept in the `process` struct (in `p->cp`). That means the continuation pointer must be written to the memory on every call, and if the called function will call other functions, it will must read the continuation pointer from `p->cp` and store it on the stack. This commit eliminates the concept of the CP register and modifies the call instructions to directly store the continuation pointer on the stack. That makes allocation and trimming of stack frames slightly faster. A more important benefit is simplification of code that handles continuation pointers. Because all continuation pointers are now stored on the stack, the special case of handling `p->cp` disappears. Co-authored-by: John Högberg <[email protected]>
2019-08-16Merge branch 'maint'John Högberg
* maint: erts: Scan heap fragments for off-heap binaries
2019-08-16Merge branch 'john/erts/process_info-binary-heap-fragments/OTP-15978' into maintJohn Högberg
* john/erts/process_info-binary-heap-fragments/OTP-15978: erts: Scan heap fragments for off-heap binaries
2019-08-15erts: Refactor ets catree deletionSverker Eriksson
to maintain consistency of the trees during yielding and by that avoid problems with test inspection like erts_debug:get_internal_state(node_and_dist_references).
2019-08-13Merge branch 'maint'John Högberg
* maint: erts: Fix crash in instrument:allocations/0-1
2019-08-13Merge branch 'john/erts/fix-instrument-allocations-race/OTP-15983' into maintJohn Högberg
* john/erts/fix-instrument-allocations-race/OTP-15983: erts: Fix crash in instrument:allocations/0-1
2019-08-12Merge branch 'maint'John Högberg
* maint: erts: Create heap binaries in binary:split/2-3 erts: Create heap binaries in binary_part/2-3 erts: Create heap binaries in split_binary/2 erts: Create heap binaries in bs_get_binary2 erts: Remove size check in bs_start_match erts: Disallow binaries whose size in bits exceeds UWORD_MAX
2019-08-12Merge branch 'john/erts/bs_get_binary2-heap-binaries/OTP-15977' into maintJohn Högberg
* john/erts/bs_get_binary2-heap-binaries/OTP-15977: erts: Create heap binaries in binary:split/2-3 erts: Create heap binaries in binary_part/2-3 erts: Create heap binaries in split_binary/2 erts: Create heap binaries in bs_get_binary2 erts: Remove size check in bs_start_match erts: Disallow binaries whose size in bits exceeds UWORD_MAX
2019-08-12erts: Fix crash in instrument:allocations/0-1John Högberg
The current carrier list was read when the allocator wasn't locked, crashing the emulator if a block scan raced with a carrier allocation.
2019-08-12erts: Scan heap fragments for off-heap binariesJohn Högberg
2019-08-09erts: Create heap binaries in binary:split/2-3John Högberg
2019-08-09erts: Create heap binaries in binary_part/2-3John Högberg
2019-08-09erts: Create heap binaries in split_binary/2John Högberg
2019-08-09erts: Create heap binaries in bs_get_binary2John Högberg
ErlSubBin is a large struct that often dwarfs the region of memory it points at, and it's common for them to refer to a ProcBin which must be kept around as long as the SubBin lives, using up even more heap space and keeping the referenced binary alive regardless of how small the sub-binary is.
2019-08-09erts: Remove size check in bs_start_matchJohn Högberg
The size check is redundant now that all binaries are guaranteed to be small enough that their size in bits fits into a word.
2019-08-09erts: Disallow binaries whose size in bits exceeds UWORD_MAXJohn Högberg
These have never worked in binary matching (including sub-binaries extracted from them) so it's hard to justify their existence. They also make a future migration of binary sizes from bytes to bits problematic, so we may as well change it ahead of time. This is potentially incompatible on 32-bit platforms where a NIF or driver could allocate 512MB+ binaries, but allocations that large should be expected to fail anyway.
2019-08-08Merge branch 'maint'John Högberg
* maint: erts: Escape atoms in erlang:fun_to_list/1
2019-08-07erts: Escape atoms in erlang:fun_to_list/1John Högberg
2019-07-22Merge branch 'maint'Rickard Green
* maint: Fix etp-ets-tables Fix node refc test for free processes hanging around Enhanced node refc bookkeeping Fix node container refc tests of ETS Fix node refc test of external data Node container refc test for persistent terms Include persistent term storage in node/dist refc check Fix node refc test for system message queue
2019-07-22Merge branch 'rickard/node-refc-tests-22' into maintRickard Green
* rickard/node-refc-tests-22: Fix etp-ets-tables Fix node refc test for free processes hanging around Enhanced node refc bookkeeping Fix node container refc tests of ETS Fix node refc test of external data Node container refc test for persistent terms Include persistent term storage in node/dist refc check Fix node refc test for system message queue
2019-07-22Fix node refc test for free processes hanging aroundRickard Green
2019-07-22Enhanced node refc bookkeepingRickard Green
2019-07-22Fix node container refc tests of ETSRickard Green
2019-07-22Fix node refc test of external dataRickard Green
2019-07-22Merge branch 'rickard/node-refc-tests-21' into rickard/node-refc-tests-22Rickard Green
* rickard/node-refc-tests-21: Node container refc test for persistent terms Include persistent term storage in node/dist refc check Fix node refc test for system message queue
2019-07-22Include persistent term storage in node/dist refc checkRickard Green
2019-07-22Merge branch 'rickard/node-refc-tests-20' into rickard/node-refc-tests-21Rickard Green
* rickard/node-refc-tests-20: Fix node refc test for system message queue
2019-07-22Fix node refc test for system message queueRickard Green
2019-07-05Merge branch 'sverker/hash-improve-shrink'Sverker Eriksson
* sverker/hash-improve-shrink: erts: Tweak hash shrink limit erts: Improve hash shrinking
2019-07-05erts: Tweak hash shrink limitSverker Eriksson
* Only shrink when we can remove one segment and still remain below 50% table load. * Only shrink down to two table segments. It just leads to a lot of potentially "unnecessary" rehashing to have a chance of getting rid of the last extra segment before the last delete op. I don't think it's worth it.
2019-07-05Merge branch 'maint'Sverker Eriksson
2019-07-05Merge branch 'sverker/valgrind-hipe-suppression' into maintSverker Eriksson
* sverker/valgrind-hipe-suppression: erts: Suppress valgrind warning in offset_heap_ptr
2019-07-05Merge branch 'sverker/ets_SUITE-fixtable_iter_bag'Sverker Eriksson
* sverker/ets_SUITE-fixtable_iter_bag: stdlib: ets_SUITE:fixtable_iter_bag
2019-07-05stdlib: ets_SUITE:fixtable_iter_bagSverker Eriksson
Turns out the bug in ets:next() that I tried to provoke with this new test wasn't really there. Oh well.
2019-07-02erts: Improve hash shrinkingSverker Eriksson
* Release is_resizing as soon as possible to improve shrink concurrency. - Do join of buckets after release, but with kept WLOCK_HASH. - Do deallocations of seg and segtab after release of both is_resizing and WLOCK_HASH. * Do lazy initialization of buckets in extended segments. - Mark inactive buckets in DEBUG.
2019-07-02Merge branch 'poroh/erts/sched-stuck-fix/OTP-15941' into maint-22Erlang/OTP
* poroh/erts/sched-stuck-fix/OTP-15941: Infinite cycle fixed on try to change run queue (if it has already changed concurrently)
2019-07-02Merge branch 'sverker/system_info-procs-bug/ERL-979/OTP-15909' into maint-22Erlang/OTP
* sverker/system_info-procs-bug/ERL-979/OTP-15909: Fix fatal bug in erts_proc_sig_signal_size
2019-07-02Merge branch 'john/erts/lists_subtract_fixes/OTP-15938/OTP-15939' into maint-22Erlang/OTP
* john/erts/lists_subtract_fixes/OTP-15938/OTP-15939: erts: Fix integer overflow in loader erts: Fix integer overflow in list subtraction
2019-07-01Merge branch 'sverker/re-enable-big-creation/OTP-15603'Sverker Eriksson
* sverker/re-enable-big-creation/OTP-15603: doc: Add links between dist flags and external tags (DTD updated) erts: Fix docs for new pid,port,ref external tags erts: Document new EPMD response ALIVE2_X_RESP erl_interface: Support 32-bit creation local cnode jinterface: Remove old encoding of pid,port,refs epmd: Support 32-bit creation values in local node erl_interface: Remove old encoding of pid,port,refs erts: Remove old encoding of pids, ports and refs erts: Make DFLAG_BIG_CREATION mandatory
2019-07-01Merge branch 'maint'Sverker Eriksson
2019-07-01Merge PR-2313 from poroh/poroh/erts/sched-stuck-fix OTP-15941Sverker Eriksson
Infinite cycle fixed on try to change run queue (if it has already ch…
2019-07-01Merge branch 'maint'John Högberg
* maint: erts: Fix integer overflow in loader erts: Fix integer overflow in list subtraction
2019-07-01Merge branch 'john/erts/lists_subtract_fixes/OTP-15938/OTP-15939' into maintJohn Högberg
* john/erts/lists_subtract_fixes/OTP-15938/OTP-15939: erts: Fix integer overflow in loader erts: Fix integer overflow in list subtraction
2019-07-01erts: Fix integer overflow in loaderJohn Högberg
qsort expects the comparison function to return an int; returning an `Sint` may yield nonsensical results.
2019-07-01erts: Fix integer overflow in list subtractionJohn Högberg
CMP_TERM returned an `Sint`, which overflowed the `int` used in erl_rbtree for storing the comparison, causing list subtraction to behave strangely.