aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-09-09 10:40:11 -0700
committerIan Lance Taylor <iant@golang.org>2020-09-09 18:04:10 +0000
commit2556eb76c8e752907600274d323a52e97418d14f (patch)
treeb96ff9b9ae8d3d87cc25ac6a5b3346773dd10fe1
parent34835df04891a1d54394888b763af88f9476101d (diff)
downloadgo-2556eb76c8e752907600274d323a52e97418d14f.tar.gz
go-2556eb76c8e752907600274d323a52e97418d14f.zip
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 <iant@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
-rw-r--r--src/runtime/proc.go7
1 files changed, 7 insertions, 0 deletions
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).