• 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
module-compiler.cc 139 KB