src/runtime/proc.go | 9 ++++++++- diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 7bc2a92590755ee3b1c40255d00c760fa30e927b..a144b36ec80b75cea5a41c7dabadceeaa18e9fcb 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -4686,7 +4686,7 @@ if mp != nil && mp.profilehz == 0 { return } - // On mips{,le}, 64bit atomics are emulated with spinlocks, in + // On mips{,le}/arm, 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). // As a workaround, create a counter of SIGPROFs while in critical section @@ -4698,6 +4698,13 @@ if hasPrefix(funcname(f), "runtime/internal/atomic") { cpuprof.lostAtomic++ return } + } + if GOARCH == "arm" && goarm < 7 && GOOS == "linux" && pc&0xffff0000 == 0xffff0000 { + // runtime/internal/atomic functions call into kernel + // helpers on arm < 7. See + // runtime/internal/atomic/sys_linux_arm.s. + cpuprof.lostAtomic++ + return } }