• Michael Lippautz's avatar
    heap: Fix incremental-concurrent processing of large FixedArray · c4eae87a
    Michael Lippautz authored
    FixedArray object in LO space are processed incrementally in ranges of slots
    size kProgressBarScanningChunk to reduce latency when returning to the
    processing loop is critical. A progress bar stores how much slots have been
    processed already.
    
    In the case of regular concurrent marking there was a guarantee that the
    object was only processed by one thread (main *or* concurrent marking
    thread) at the same time.
    
    However, some optimizations that avoid write barriers for each
    individual write operation emit a batched write barrier that requires
    re-visiting the FixedArray for the marking barrier. In such cases, the
    progress bar would be reset using relaxed stores which is problematic as
    the concurrent marking thread could race on setting its own progress on the
    progress bar. As a result, the array would only be re-scanned partially.
    
    The fix involves using CAS to set the progress bar and bail out in the
    case an inconsistent state was observed.
    
    In the following:
    MT... main thread
    CM... concurrent marking thread
    
    The interesting cases are:
    1. MT *or* CM processes the array without interfering: Progress bar is
       updated monotonically without failing.
    3. MT interferes with itself: The progress bar is just reset and the main
       thread will restart scanning from index 0. The object is added twice to
       the marking worklist and processed each time one of the entries is
       retrieved from the worklist.
    4. MT interferes with CM:
       4.a.: CM processes a range of slots and re-adds the left overs by
       setting the progress bar and re-adding the array to the worklist.  In
       this case CM *and* MT process the array from index 0. The first time
       the CAS for setting the progress bar fails on either of the threads,
       the looser will bail out and leave processing for the winner.
       4.b.: CM is interrupted while processing a range of the array and
       fails in setting the progress bar for the left overs. In this case
       the CM bails out right away and the main thread starts processing
       from index 0.
    
    In addition, there is a transition from index 0 to the index of the
    first actual slot. This transition makes it possible to observe a reset
    while processing the first actual chunk of slots.
    
    Bug: chromium:942699
    Change-Id: I0b06f47ee075030dadfc959528cd77b6b69bbec2
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1532325Reviewed-by: 's avatarHannes Payer <hpayer@chromium.org>
    Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
    Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#60385}
    c4eae87a
Name
Last commit
Last update
benchmarks Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...