diff options
| author | Keith Randall <khr@golang.org> | 2025-05-05 10:51:52 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-05-05 13:08:27 -0700 |
| commit | fa2bb342d7b0024440d996c2d6d6778b7a5e0247 (patch) | |
| tree | c64fe4b39f32fbca02ee89e22f54fb9e991a828c /src/runtime | |
| parent | 6729fbe93e535080e9e050b3ca0a80ab407dbacc (diff) | |
| download | go-fa2bb342d7b0024440d996c2d6d6778b7a5e0247.tar.xz | |
Revert "cmd/compile: allow all of the preamble to be preemptible"
This reverts commits
3f3782feed6e0726ddb08afd32dad7d94fbb38c6 (CL 648518)
b386b628521780c048af14a148f373c84e687b26 (CL 668475)
Fixes #73542
Change-Id: I218851c5c0b62700281feb0b3f82b6b9b97b910d
Reviewed-on: https://go-review.googlesource.com/c/go/+/670055
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/preempt.go | 1 | ||||
| -rw-r--r-- | src/runtime/runtime2.go | 39 | ||||
| -rw-r--r-- | src/runtime/stack.go | 23 |
3 files changed, 16 insertions, 47 deletions
diff --git a/src/runtime/preempt.go b/src/runtime/preempt.go index 364929f635..c41c355835 100644 --- a/src/runtime/preempt.go +++ b/src/runtime/preempt.go @@ -173,7 +173,6 @@ func suspendG(gp *g) suspendGState { // _Gscan bit and thus own the stack. gp.preemptStop = false gp.preempt = false - gp.preemptRecent = true gp.stackguard0 = gp.stack.lo + stackGuard // The goroutine was already at a safe-point diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index f42c940b8e..05cf345baf 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -466,29 +466,22 @@ type g struct { runnableTime int64 // the amount of time spent runnable, cleared when running, only used when tracking lockedm muintptr fipsIndicator uint8 - - // preemptRecent is set when a goroutine is preempted. It is - // reset by code passing through the synchronous preemption - // path. It is used to avoid growing the stack when we were - // just preempting, see issue 35470. - preemptRecent bool - - sig uint32 - writebuf []byte - sigcode0 uintptr - sigcode1 uintptr - sigpc uintptr - parentGoid uint64 // goid of goroutine that created this goroutine - gopc uintptr // pc of go statement that created this goroutine - ancestors *[]ancestorInfo // ancestor information goroutine(s) that created this goroutine (only used if debug.tracebackancestors) - startpc uintptr // pc of goroutine function - racectx uintptr - waiting *sudog // sudog structures this g is waiting on (that have a valid elem ptr); in lock order - cgoCtxt []uintptr // cgo traceback context - labels unsafe.Pointer // profiler labels - timer *timer // cached timer for time.Sleep - sleepWhen int64 // when to sleep until - selectDone atomic.Uint32 // are we participating in a select and did someone win the race? + sig uint32 + writebuf []byte + sigcode0 uintptr + sigcode1 uintptr + sigpc uintptr + parentGoid uint64 // goid of goroutine that created this goroutine + gopc uintptr // pc of go statement that created this goroutine + ancestors *[]ancestorInfo // ancestor information goroutine(s) that created this goroutine (only used if debug.tracebackancestors) + startpc uintptr // pc of goroutine function + racectx uintptr + waiting *sudog // sudog structures this g is waiting on (that have a valid elem ptr); in lock order + cgoCtxt []uintptr // cgo traceback context + labels unsafe.Pointer // profiler labels + timer *timer // cached timer for time.Sleep + sleepWhen int64 // when to sleep until + selectDone atomic.Uint32 // are we participating in a select and did someone win the race? // goroutineProfiled indicates the status of this goroutine's stack for the // current in-progress goroutine profile diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 67a394cd12..2fedaa9421 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -1075,29 +1075,6 @@ func newstack() { gopreempt_m(gp) // never return } - if stackguard0 == gp.stack.lo+stackGuard && gp.preemptRecent { - // The case happens because of an interaction between synchronous - // and asynchronous preemption. First, we set the cooperative - // preemption signal (g.stackguard0 = stackPreempt), and as a - // result the function fails the stack check and enters its - // morestack path. If it gets suspended at that point, we might - // give up waiting for it and send an async preempt. That async - // preempt gets processed and clears the cooperative preemption - // signal (g.stackguard0 = g.stack.lo+stackGuard) and resumes - // the function. But even though the cooperative preemption - // signal is cleared, we're already on the morestack path and - // can't avoid calling morestack. See issue 35470. - // - // To avoid this problem, if we've been preempted recently, - // clear the "preempted recently" flag and resume the G. - // If we really did need more stack, the morestack check will - // immediately fail and we'll get back here to try again (with - // preemptRecent==false, so we don't take this case the - // second time). - gp.preemptRecent = false - gogo(&gp.sched) // never return - } - // Allocate a bigger segment and move the stack. oldsize := gp.stack.hi - gp.stack.lo newsize := oldsize * 2 |
