]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add goschedIfBusy to bgsweep to prevent livelock after inlining
authorArsenySamoylov <samoylov.arseny@gmail.com>
Fri, 25 Apr 2025 11:28:52 +0000 (14:28 +0300)
committerGopher Robot <gobot@golang.org>
Mon, 12 May 2025 17:07:14 +0000 (10:07 -0700)
gcMarkTermination() ensures that all caches are flushed before continuing the GC cycle, thus preempting all goroutines.
However, inlining calls to lock() in bgsweep makes it non-preemptible for most of the time, leading to livelock.
This change adds explicit preemption to avoid this.

Fixes #73499.

Change-Id: I4abf0d658f3d7a03ad588469cd013a0639de0c8a
Reviewed-on: https://go-review.googlesource.com/c/go/+/668795
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/mgcsweep.go

index 046dd798c86debc1b62fc7381c35fed0475f98e7..f4d43e73f2c925cab1f1623d1ae142aac423eaa2 100644 (file)
@@ -313,6 +313,10 @@ func bgsweep(c chan int) {
                        // gosweepone returning ^0 above
                        // and the lock being acquired.
                        unlock(&sweep.lock)
+                       // This goroutine must preempt when we have no work to do
+                       // but isSweepDone returns false because of another existing sweeper.
+                       // See issue #73499.
+                       goschedIfBusy()
                        continue
                }
                sweep.parked = true