From 7a606fef6697f28ae6edebd64e5e8817349cdd92 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Sat, 28 Oct 2023 16:20:04 +0000 Subject: [PATCH] runtime: split out pointer/scalar metadata from heapArena We're going to want to fork this data in the near future for a GOEXPERIMENT, so break it out now. Change-Id: Ia7ded850bb693c443fe439c6b7279dcac638512c Reviewed-on: https://go-review.googlesource.com/c/go/+/537978 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Cherry Mui Auto-Submit: Michael Knyszek --- src/runtime/mbitmap.go | 21 +++++++++++++++++++++ src/runtime/mheap.go | 19 ++----------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index 20323ff82d..e918b3d489 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -46,6 +46,27 @@ import ( "unsafe" ) +// heapArenaPtrScalar contains the per-heapArena pointer/scalar metadata for the GC. +type heapArenaPtrScalar struct { + // bitmap stores the pointer/scalar bitmap for the words in + // this arena. See mbitmap.go for a description. + // This array uses 1 bit per word of heap, or 1.6% of the heap size (for 64-bit). + bitmap [heapArenaBitmapWords]uintptr + + // If the ith bit of noMorePtrs is true, then there are no more + // pointers for the object containing the word described by the + // high bit of bitmap[i]. + // In that case, bitmap[i+1], ... must be zero until the start + // of the next object. + // We never operate on these entries using bit-parallel techniques, + // so it is ok if they are small. Also, they can't be bigger than + // uint16 because at that size a single noMorePtrs entry + // represents 8K of memory, the minimum size of a span. Any larger + // and we'd have to worry about concurrent updates. + // This array uses 1 bit per word of bitmap, or .024% of the heap size (for 64-bit). + noMorePtrs [heapArenaBitmapWords / 8]uint8 +} + // addb returns the byte pointer p+n. // //go:nowritebarrier diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 42318ca04c..62ad5e2f29 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -239,23 +239,8 @@ var mheap_ mheap type heapArena struct { _ sys.NotInHeap - // bitmap stores the pointer/scalar bitmap for the words in - // this arena. See mbitmap.go for a description. - // This array uses 1 bit per word of heap, or 1.6% of the heap size (for 64-bit). - bitmap [heapArenaBitmapWords]uintptr - - // If the ith bit of noMorePtrs is true, then there are no more - // pointers for the object containing the word described by the - // high bit of bitmap[i]. - // In that case, bitmap[i+1], ... must be zero until the start - // of the next object. - // We never operate on these entries using bit-parallel techniques, - // so it is ok if they are small. Also, they can't be bigger than - // uint16 because at that size a single noMorePtrs entry - // represents 8K of memory, the minimum size of a span. Any larger - // and we'd have to worry about concurrent updates. - // This array uses 1 bit per word of bitmap, or .024% of the heap size (for 64-bit). - noMorePtrs [heapArenaBitmapWords / 8]uint8 + // heapArenaPtrScalar contains pointer/scalar data about the heap for this heap arena. + heapArenaPtrScalar // spans maps from virtual address page ID within this arena to *mspan. // For allocated spans, their pages map to the span itself. -- 2.50.0