]> Cypherpunks repositories - gostls13.git/commit
runtime: make allocNeedsZero lock-free
authorMichael Anthony Knyszek <mknyszek@google.com>
Mon, 28 Oct 2019 19:17:21 +0000 (19:17 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 8 Nov 2019 16:20:17 +0000 (16:20 +0000)
commit4208dbef161c554b30607f48c347a6c97add80b3
tree1b4da43dd8b3a25b41514b13d594b79c3ae90b82
parent52aebe8d2150f2709c32f1dceb5d58bab90bc86f
runtime: make allocNeedsZero lock-free

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: Austin Clements <austin@google.com>
src/runtime/mheap.go