From 415e948eaea05930b2a16bab6af9e38b24e8414b Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 30 Jun 2017 12:10:01 -0400 Subject: [PATCH] runtime: improve mheap.alloc doc and let compiler check system stack The alloc_m documentation refers to concepts that don't exist (and maybe never did?). alloc_m is also not the API entry point to span allocation. Hence, rewrite the documentation for alloc and alloc_m. While we're here, document why alloc_m must run on the system stack and replace alloc_m's hand-implemented system stack check with a go:systemstack annotation. Change-Id: I30e263d8e53c2774a6614e1b44df5464838cef09 Reviewed-on: https://go-review.googlesource.com/c/139459 Run-TryBot: Austin Clements Reviewed-by: Michael Knyszek Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/runtime/mheap.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 7a11bdc058..b92e27e4e0 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -657,13 +657,14 @@ func (h *mheap) reclaim(npage uintptr) { lock(&h.lock) } -// Allocate a new span of npage pages from the heap for GC'd memory -// and record its size class in the HeapMap and HeapMapCache. +// alloc_m is the internal implementation of mheap.alloc. +// +// alloc_m must run on the system stack because it locks the heap, so +// any stack growth during alloc_m would self-deadlock. +// +//go:systemstack func (h *mheap) alloc_m(npage uintptr, spanclass spanClass, large bool) *mspan { _g_ := getg() - if _g_ != _g_.m.g0 { - throw("_mheap_alloc not on g0 stack") - } lock(&h.lock) // To prevent excessive heap growth, before allocating n pages @@ -752,6 +753,12 @@ func (h *mheap) alloc_m(npage uintptr, spanclass spanClass, large bool) *mspan { return s } +// alloc allocates a new span of npage pages from the GC'd heap. +// +// Either large must be true or spanclass must indicates the span's +// size class and scannability. +// +// If needzero is true, the memory for the returned span will be zeroed. func (h *mheap) alloc(npage uintptr, spanclass spanClass, large bool, needzero bool) *mspan { // Don't do any operations that lock the heap on the G stack. // It might trigger stack growth, and the stack growth code needs -- 2.50.0