• Michael Anthony Knyszek's avatar
    runtime: make allocNeedsZero lock-free · 4208dbef
    Michael Anthony Knyszek authored
    In preparation for a lockless fast path in the page allocator, this
    change makes it so that checking if an allocation needs to be zeroed may
    be done atomically.
    
    Unfortunately, this means there is a CAS-loop to ensure monotonicity of
    the zeroedBase value in heapArena. This CAS-loop exits if an allocator
    acquiring memory further on in the arena wins or if it succeeds. The
    CAS-loop should have a relatively small amount of contention because of
    this monotonicity, though it would be ideal if we could just have
    CAS-ers with the greatest value always win. The CAS-loop is unnecessary
    in the steady-state, but should bring some start-up performance gains as
    it's likely cheaper than the additional zeroing required, especially for
    large allocations.
    
    For very large allocations that span arenas, the CAS-loop should be
    completely uncontended for most of the arenas it touches, it may only
    encounter contention on the first and last arena.
    
    Updates #35112.
    
    Change-Id: If3d19198b33f1b1387b71e1ce5902d39a5c0f98e
    Reviewed-on: https://go-review.googlesource.com/c/go/+/203859
    Run-TryBot: Michael Knyszek <mknyszek@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarAustin Clements <austin@google.com>
    4208dbef
mheap.go 57.4 KB