runtime: make allocNeedsZero lock-free
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 <4473450dc5c88f06e1fb787f303d7805ec2aee65@google.com>
TryBot-Result: Gobot Gobot <66cb808b70d30c07676d5e946fee83fd561249e5@golang.org>
Reviewed-by: Austin Clements <7ea35d812706d9213868749011af1ed4fa2f6aa0@google.com>

golang/go,golang/go,golang/go,nawawi/go,nawawi/go,CAFxX/go,akutz/go,nawawi/go,cloudflare/go,akutz/go,golang/go,nawawi/go,akutz/go,golang/go,cloudflare/go,CAFxX/go,nawawi/go,cloudflare/go,cloudflare/go,CAFxX/go,nawawi/go,akutz/go,cloudflare/go,cloudflare/go,akutz/go,CAFxX/go,cloudflare/go,nawawi/go,golang/go,golang/go,golang/go,CAFxX/go,CAFxX/go,akutz/go,nawawi/go,cloudflare/go,akutz/go,akutz/go,CAFxX/go,CAFxX/go