From: Ian Lance Taylor Date: Fri, 15 Apr 2022 20:46:00 +0000 (-0700) Subject: [release-branch.go1.18] runtime: don't block preemption signal in new M's or ensureSigM X-Git-Tag: go1.18.2~16 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3e79a84853091717c0274281270992f55d2fad04;p=gostls13.git [release-branch.go1.18] runtime: don't block preemption signal in new M's or ensureSigM No test because we already have a test in the syscall package. The issue reports 1 failure per 100,000 iterations, which is rare enough that our builders won't catch the problem. For #52226 Fixes #52375 Change-Id: I17633ff6cf676b6d575356186dce42cdacad0746 Reviewed-on: https://go-review.googlesource.com/c/go/+/400315 Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek Reviewed-by: Ian Lance Taylor (cherry picked from commit e3982660a73b04a87c08215cb5aaa16d816ea573) Reviewed-on: https://go-review.googlesource.com/c/go/+/400318 Reviewed-by: Austin Clements --- diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 2dd4cc51a3..5cb51d10ba 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -1234,6 +1234,7 @@ func unminitSignals() { // blockableSig reports whether sig may be blocked by the signal mask. // We never want to block the signals marked _SigUnblock; // these are the synchronous signals that turn into a Go panic. +// We never want to block the preemption signal if it is being used. // In a Go program--not a c-archive/c-shared--we never want to block // the signals marked _SigKill or _SigThrow, as otherwise it's possible // for all running threads to block them and delay their delivery until @@ -1244,6 +1245,9 @@ func blockableSig(sig uint32) bool { if flags&_SigUnblock != 0 { return false } + if sig == sigPreempt && preemptMSupported && debug.asyncpreemptoff == 0 { + return false + } if isarchive || islibrary { return true }