diff options
| author | Keith Randall <khr@golang.org> | 2024-01-11 12:52:16 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2024-01-11 21:16:56 +0000 |
| commit | 0f3876f8c12ba3746a1dfec68422e9cce5c2ff39 (patch) | |
| tree | eb278463dd6e8c0ade8739382286fde0576582ba | |
| parent | 25c5f6f15988f1abb9738bfdfd10331afefd8ec1 (diff) | |
| download | go-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.go | 6 | ||||
| -rw-r--r-- | src/runtime/mbitmap_allocheaders.go | 1 | ||||
| -rw-r--r-- | src/runtime/mgcsweep.go | 3 |
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() { |
