Commit df6025bc authored by Austin Clements's avatar Austin Clements

runtime: disallow malloc or panic in scavenge

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: default avatarRick Hudson <rlh@golang.org>
parent 13ae271d
...@@ -991,6 +991,11 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr { ...@@ -991,6 +991,11 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr {
} }
func (h *mheap) scavenge(k int32, now, limit uint64) { 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) lock(&h.lock)
var sumreleased uintptr var sumreleased uintptr
for i := 0; i < len(h.free); i++ { for i := 0; i < len(h.free); i++ {
...@@ -998,6 +1003,7 @@ func (h *mheap) scavenge(k int32, now, limit uint64) { ...@@ -998,6 +1003,7 @@ func (h *mheap) scavenge(k int32, now, limit uint64) {
} }
sumreleased += scavengelist(&h.freelarge, now, limit) sumreleased += scavengelist(&h.freelarge, now, limit)
unlock(&h.lock) unlock(&h.lock)
gp.m.mallocing--
if debug.gctrace > 0 { if debug.gctrace > 0 {
if sumreleased > 0 { if sumreleased > 0 {
......
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