]> Cypherpunks repositories - gostls13.git/commit
runtime: free spanQueue on P destroy
authorMichael Pratt <mpratt@google.com>
Mon, 6 Oct 2025 21:28:37 +0000 (17:28 -0400)
committerMichael Pratt <mpratt@google.com>
Tue, 7 Oct 2025 19:16:53 +0000 (12:16 -0700)
commit3ee761739b0cbb074f5a6e8b28b491664ec1414a
treeb3b7d00a16e018c74135c5124e02382f65927b3d
parent8709a41d5ef7321f486a1857f189c3fee20e8edd
runtime: free spanQueue on P destroy

Span queues must be empty when destroying a P since we are outside of
the mark phase. But we don't actually free them, so they simply sit
around using memory. More importantly, they are still in
work.spanSPMCs.all, so freeDeadSpanSPMCs must continue traversing past
them until the end of time.

Prior to CL 709575, keeping them in work.spanSPMCs.all allowed programs
with low GOMAXPROCS to continue triggering the bug if they ever had high
GOMAXPROCS in the past.

The spanSPMCs list is singly-linked, so it is not efficient to remove a
random element from the middle. Instead, we simply mark it as dead to
all freeDeadSpanSPMCs to free it when it scans the full list.

For #75771.

Change-Id: I6a6a636cfa22a4bdef0c273d083c91553e923fe5
Reviewed-on: https://go-review.googlesource.com/c/go/+/709656
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/mgcmark_greenteagc.go
src/runtime/mgcmark_nogreenteagc.go
src/runtime/proc.go