From 2556eb76c8e752907600274d323a52e97418d14f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 9 Sep 2020 10:40:11 -0700 Subject: runtime: ignore SIGPROF if profiling disable for thread This avoids a deadlock on prof.signalLock between setcpuprofilerate and cpuprof.add if a SIGPROF is delivered to the thread between the call to setThreadCPUProfiler and acquiring prof.signalLock. Fixes #41014 Change-Id: Ie825e8594f93a19fb1a6320ed640f4e631553596 Reviewed-on: https://go-review.googlesource.com/c/go/+/253758 Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/runtime/proc.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 341d52aea8..739745aa26 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3928,6 +3928,13 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) { return } + // If mp.profilehz is 0, then profiling is not enabled for this thread. + // We must check this to avoid a deadlock between setcpuprofilerate + // and the call to cpuprof.add, below. + if mp != nil && mp.profilehz == 0 { + return + } + // On mips{,le}, 64bit atomics are emulated with spinlocks, in // runtime/internal/atomic. If SIGPROF arrives while the program is inside // the critical section, it creates a deadlock (when writing the sample). -- cgit v1.2.3-54-g00ecf