Revert "cmd/compile: allow all of the preamble to be preemptible"

This reverts commits

3f3782feed (CL 648518)
b386b62852 (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>
This commit is contained in:
Keith Randall 2025-05-05 10:51:52 -07:00 committed by Gopher Robot
parent 6729fbe93e
commit fa2bb342d7
12 changed files with 127 additions and 59 deletions

View file

@ -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