]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: disallow malloc or panic in scavenge
authorAustin Clements <austin@google.com>
Thu, 16 Mar 2017 21:02:24 +0000 (17:02 -0400)
committerAustin Clements <austin@google.com>
Sun, 19 Mar 2017 22:42:28 +0000 (22:42 +0000)
Mallocs and panics in the scavenge path are particularly nasty because
they're likely to silently self-deadlock on the mheap.lock. Avoid
sinking lots of time into debugging these issues in the future by
turning these into immediate throws.

Change-Id: Ib36fdda33bc90b21c32432b03561630c1f3c69bc
Reviewed-on: https://go-review.googlesource.com/38293
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mheap.go

index e08680023ddb43adb1fa498c61fae2893d058ead..8cd78d460abfe42152cb2f5699bc4293d71e55dc 100644 (file)
@@ -991,6 +991,11 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr {
 }
 
 func (h *mheap) scavenge(k int32, now, limit uint64) {
+       // Disallow malloc or panic while holding the heap lock. We do
+       // this here because this is an non-mallocgc entry-point to
+       // the mheap API.
+       gp := getg()
+       gp.m.mallocing++
        lock(&h.lock)
        var sumreleased uintptr
        for i := 0; i < len(h.free); i++ {
@@ -998,6 +1003,7 @@ func (h *mheap) scavenge(k int32, now, limit uint64) {
        }
        sumreleased += scavengelist(&h.freelarge, now, limit)
        unlock(&h.lock)
+       gp.m.mallocing--
 
        if debug.gctrace > 0 {
                if sumreleased > 0 {