Commit 9d36163c authored by Austin Clements's avatar Austin Clements

runtime: consistently use atomic loads for heap_live

heap_live is updated atomically without locking, so we should also use
atomic loads to read it. Fix the reads of heap_live that happen
outside of STW to be atomic.

Change-Id: Idca9451c348168c2a792a9499af349833a3c333f
Reviewed-on: https://go-review.googlesource.com/41371
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRick Hudson <rlh@golang.org>
parent 44fe0820
......@@ -537,7 +537,7 @@ func (c *gcControllerState) revise() {
}
// Compute the heap distance remaining.
heapDistance := int64(memstats.next_gc) - int64(memstats.heap_live)
heapDistance := int64(memstats.next_gc) - int64(atomic.Load64(&memstats.heap_live))
if heapDistance <= 0 {
// This shouldn't happen, but if it does, avoid
// dividing by zero or setting the assist negative.
......@@ -1073,6 +1073,10 @@ func (t gcTrigger) test() bool {
}
switch t.kind {
case gcTriggerHeap:
// Non-atomic access to heap_live for performance. If
// we are going to trigger on this, this thread just
// atomically wrote heap_live anyway and we'll see our
// own write.
return memstats.heap_live >= memstats.gc_trigger
case gcTriggerTime:
lastgc := int64(atomic.Load64(&memstats.last_gc_nanotime))
......@@ -1157,7 +1161,7 @@ func gcStart(mode gcMode, trigger gcTrigger) {
now := nanotime()
work.stwprocs, work.maxprocs = gcprocs(), gomaxprocs
work.tSweepTerm = now
work.heap0 = memstats.heap_live
work.heap0 = atomic.Load64(&memstats.heap_live)
work.pauseNS = 0
work.mode = mode
......@@ -1985,7 +1989,7 @@ func gcResetMarkState() {
unlock(&allglock)
work.bytesMarked = 0
work.initialHeapLive = memstats.heap_live
work.initialHeapLive = atomic.Load64(&memstats.heap_live)
work.markrootDone = false
}
......
......@@ -121,6 +121,8 @@ type mstats struct {
// leads to a conservative GC rate rather than a GC rate that
// is potentially too low.
//
// Reads should likewise be atomic (or during STW).
//
// Whenever this is updated, call traceHeapAlloc() and
// gcController.revise().
heap_live uint64
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment