• Daniel Lehmann's avatar
    [wasm] publish TurboFan results in batches · 990c9386
    Daniel Lehmann authored
    With mprotect-based write protection of the WebAssembly code space,
    we switch page protection flags each time (at least) one compilation
    thread needs write access. Two such switches happen when TurboFan
    compilation results are available in {ExecuteCompilationUnits}: One
    switch happens when calling {NativeModule::AddCompiledCode} and one more
    when calling {NativeModule::PublishCode} via
    {SchedulePublishCompilationResults} and {PublishCompilationResults}.
    
    So far, each TurboFan result was published eagerly, i.e., as soon as it
    became available. This has the benefit that faster code is available
    immediately, and had no large cost or downside without write protection.
    However, with write protection switching permissions is expensive (an
    mprotect syscall) and needs to lock the
    {WasmCodeAllocator::allocation_mutex_} (which causes lock contention and
    under Linux many futex syscalls). Thus, immediately publishing each
    TurboFan result when using write protection can cause up to 10x slower
    compilation compared with not using write protection. In terms of
    syscalls we measured (non scientifically) with
    {sudo perf stat -e 'syscalls:sys_enter*' d8 ...} on the Unity benchmark:
    - mprotect: 10k vs. 44k syscalls (baseline vs. write protection)
    - futex: 31k vs. 112k syscalls (baseline vs. write protection)
    - sys time: 1.6s vs. 10s (baseline vs. write protection)
    All of those are clearly to high.
    
    The fix here is simply to batch togther multiple TurboFan functions into
    one publishing step when using write protection. The batching logic
    already exists for Liftoff, so we can just disable eager publishing for
    TurboFan when using write protection. Additionally, we publish once when
    all Liftoff results are available (even if the batch is not complete),
    such that time-to-execute is not regressed.
    
    R=clemensb@chromium.org
    CC=​​​​jkummerow@chromium.org
    
    Bug: v8:11663, chromium:932033
    Change-Id: Ibf6f28ecf4733b40322e62761e66046dec60a125
    Cq-Include-Trybots: luci.v8.try:v8_linux64_fyi_rel_ng
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2922114
    Commit-Queue: Daniel Lehmann <dlehmann@google.com>
    Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#74829}
    990c9386
Name
Last commit
Last update
..
api Loading commit data...
asmjs Loading commit data...
ast Loading commit data...
base Loading commit data...
baseline Loading commit data...
bigint Loading commit data...
builtins Loading commit data...
codegen Loading commit data...
common Loading commit data...
compiler Loading commit data...
compiler-dispatcher Loading commit data...
d8 Loading commit data...
date Loading commit data...
debug Loading commit data...
deoptimizer Loading commit data...
diagnostics Loading commit data...
execution Loading commit data...
extensions Loading commit data...
flags Loading commit data...
handles Loading commit data...
heap Loading commit data...
ic Loading commit data...
init Loading commit data...
inspector Loading commit data...
interpreter Loading commit data...
json Loading commit data...
libplatform Loading commit data...
libsampler Loading commit data...
logging Loading commit data...
numbers Loading commit data...
objects Loading commit data...
parsing Loading commit data...
profiler Loading commit data...
protobuf Loading commit data...
regexp Loading commit data...
roots Loading commit data...
runtime Loading commit data...
sanitizer Loading commit data...
snapshot Loading commit data...
strings Loading commit data...
tasks Loading commit data...
third_party Loading commit data...
torque Loading commit data...
tracing Loading commit data...
trap-handler Loading commit data...
utils Loading commit data...
wasm Loading commit data...
web-snapshot Loading commit data...
zone Loading commit data...
DEPS Loading commit data...
DIR_METADATA Loading commit data...
OWNERS Loading commit data...