Skip to content

Commit

Permalink
runtime: split out pointer/scalar metadata from heapArena
Browse files Browse the repository at this point in the history
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 <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
  • Loading branch information
mknyszek authored and pull[bot] committed Mar 26, 2024
1 parent a6b90a0 commit 5388f2f
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
21 changes: 21 additions & 0 deletions src/runtime/mbitmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 2 additions & 17 deletions src/runtime/mheap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 5388f2f

Please sign in to comment.