mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: use entire address space on 32 bit
In issue #13992, Russ mentioned that the heap bitmap footprint was halved but that the bitmap size calculation hadn't been updated. This presents the opportunity to either halve the bitmap size or double the addressable virtual space. This CL doubles the addressable virtual space. On 32 bit this can be tweaked further to allow the bitmap to cover the entire 4GB virtual address space, removing a failure mode if the kernel hands out memory with a too low address. First, fix the calculation and double _MaxArena32 to cover 4GB virtual memory space with the same bitmap size (256 MB). Then, allow the fallback mode for the initial memory reservation on 32 bit (or 64 bit with too little available virtual memory) to not include space for the arena. mheap.sysAlloc will automatically reserve additional space when the existing arena is full. Finally, set arena_start to 0 in 32 bit mode, so that any address is acceptable for subsequent (additional) reservations. Before, the bitmap was always located just before arena_start, so fix the two places relying on that assumption: Point the otherwise unused mheap.bitmap to one byte after the end of the bitmap, and use it for bitmap addressing instead of arena_start. With arena_start set to 0 on 32 bit, the cgoInRange check is no longer a sufficient check for Go pointers. Introduce and call inHeapOrStack to check whether a pointer is to the Go heap or stack. While we're here, remove sysReserveHigh which seems to be unused. Fixes #13992 Change-Id: I592b513148a50b9d3967b5c5d94b86b3ec39acc2 Reviewed-on: https://go-review.googlesource.com/20471 Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
83676d694b
commit
e6ec82067a
4 changed files with 52 additions and 54 deletions
|
|
@ -46,7 +46,7 @@ type mheap struct {
|
|||
nsmallfree [_NumSizeClasses]uint64 // number of frees for small objects (<=maxsmallsize)
|
||||
|
||||
// range of addresses we might see in the heap
|
||||
bitmap uintptr
|
||||
bitmap uintptr // Points to one byte past the end of the bitmap
|
||||
bitmap_mapped uintptr
|
||||
arena_start uintptr
|
||||
arena_used uintptr // always mHeap_Map{Bits,Spans} before updating
|
||||
|
|
@ -268,6 +268,28 @@ func inheap(b uintptr) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
// inHeapOrStack is a variant of inheap that returns true for pointers into stack spans.
|
||||
//go:nowritebarrier
|
||||
//go:nosplit
|
||||
func inHeapOrStack(b uintptr) bool {
|
||||
if b == 0 || b < mheap_.arena_start || b >= mheap_.arena_used {
|
||||
return false
|
||||
}
|
||||
// Not a beginning of a block, consult span table to find the block beginning.
|
||||
s := h_spans[(b-mheap_.arena_start)>>_PageShift]
|
||||
if s == nil || b < s.base() {
|
||||
return false
|
||||
}
|
||||
switch s.state {
|
||||
case mSpanInUse:
|
||||
return b < s.limit
|
||||
case _MSpanStack:
|
||||
return b < s.base()+s.npages<<_PageShift
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: spanOf and spanOfUnchecked are open-coded in a lot of places.
|
||||
// Use the functions instead.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue