aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2024-01-11 12:52:16 -0800
committerGopher Robot <gobot@golang.org>2024-01-11 21:16:56 +0000
commit0f3876f8c12ba3746a1dfec68422e9cce5c2ff39 (patch)
treeeb278463dd6e8c0ade8739382286fde0576582ba
parent25c5f6f15988f1abb9738bfdfd10331afefd8ec1 (diff)
downloadgo-0f3876f8c12ba3746a1dfec68422e9cce5c2ff39.tar.xz
runtime: ensure we free unrolled GC bitmaps
CL 555355 has a bug in it - the GC program flag was also used to decide when to free the unrolled bitmap. After that CL, we just don't free any unrolled bitmaps, leading to a memory leak. Use a separate flag to track types that need to be freed when their corresponding object is freed. Change-Id: I841b65492561f5b5e1853875fbd8e8a872205a84 Reviewed-on: https://go-review.googlesource.com/c/go/+/555416 Auto-Submit: Keith Randall <khr@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Keith Randall <khr@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
-rw-r--r--src/internal/abi/type.go6
-rw-r--r--src/runtime/mbitmap_allocheaders.go1
-rw-r--r--src/runtime/mgcsweep.go3
3 files changed, 9 insertions, 1 deletions
diff --git a/src/internal/abi/type.go b/src/internal/abi/type.go
index 86f055cb91..659fb7bffd 100644
--- a/src/internal/abi/type.go
+++ b/src/internal/abi/type.go
@@ -111,6 +111,12 @@ const (
// TFlagRegularMemory means that equal and hash functions can treat
// this type as a single region of t.size bytes.
TFlagRegularMemory TFlag = 1 << 3
+
+ // TFlagUnrolledBitmap marks special types that are unrolled-bitmap
+ // versions of types with GC programs.
+ // These types need to be deallocated when the underlying object
+ // is freed.
+ TFlagUnrolledBitmap TFlag = 1 << 4
)
// NameOff is the offset to a name from moduledata.types. See resolveNameOff in runtime.
diff --git a/src/runtime/mbitmap_allocheaders.go b/src/runtime/mbitmap_allocheaders.go
index bc574ad689..1ec055352e 100644
--- a/src/runtime/mbitmap_allocheaders.go
+++ b/src/runtime/mbitmap_allocheaders.go
@@ -886,6 +886,7 @@ func heapSetType(x, dataSize uintptr, typ *_type, header **_type, span *mspan) (
gctyp.Size_ = typ.Size_
gctyp.PtrBytes = typ.PtrBytes
gctyp.GCData = (*byte)(add(unsafe.Pointer(progSpan.base()), heapBitsOff))
+ gctyp.TFlag = abi.TFlagUnrolledBitmap
// Expand the GC program into space reserved at the end of the new span.
runGCProg(addb(typ.GCData, 4), gctyp.GCData)
diff --git a/src/runtime/mgcsweep.go b/src/runtime/mgcsweep.go
index 0fbb23d573..3dbe9bcec7 100644
--- a/src/runtime/mgcsweep.go
+++ b/src/runtime/mgcsweep.go
@@ -25,6 +25,7 @@
package runtime
import (
+ "internal/abi"
"internal/goexperiment"
"runtime/internal/atomic"
"unsafe"
@@ -789,7 +790,7 @@ func (sl *sweepLocked) sweep(preserve bool) bool {
} else {
mheap_.freeSpan(s)
}
- if goexperiment.AllocHeaders && s.largeType != nil && s.largeType.Kind_&kindGCProg != 0 {
+ if goexperiment.AllocHeaders && s.largeType != nil && s.largeType.TFlag&abi.TFlagUnrolledBitmap != 0 {
// In the allocheaders experiment, the unrolled GCProg bitmap is allocated separately.
// Free the space for the unrolled bitmap.
systemstack(func() {