Skip to content

Commit 20a620f

Browse files
committed
runtime: drop SIGPROF while in ARM < 7 kernel helpers
On Linux ARMv6 and below runtime/internal/atomic.Cas calls into a kernel cas helper at a fixed address. If a SIGPROF arrives while executing the kernel helper, the sigprof lostAtomic logic will miss that we are potentially in the spinlock critical section, which could cause a deadlock when using atomics later in sigprof. Fixes #47505 Change-Id: If8ba0d0fc47e45d4e6c68eca98fac4c6ed4e43c1 Reviewed-on: https://go-review.googlesource.com/c/go/+/341889 Trust: Michael Pratt <[email protected]> Run-TryBot: Michael Pratt <[email protected]> Reviewed-by: Michael Knyszek <[email protected]> Reviewed-by: Cherry Mui <[email protected]> TryBot-Result: Go Bot <[email protected]>
1 parent 4c8ffb3 commit 20a620f

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/runtime/proc.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -4619,7 +4619,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
46194619
return
46204620
}
46214621

4622-
// On mips{,le}, 64bit atomics are emulated with spinlocks, in
4622+
// On mips{,le}/arm, 64bit atomics are emulated with spinlocks, in
46234623
// runtime/internal/atomic. If SIGPROF arrives while the program is inside
46244624
// the critical section, it creates a deadlock (when writing the sample).
46254625
// As a workaround, create a counter of SIGPROFs while in critical section
@@ -4632,6 +4632,13 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
46324632
return
46334633
}
46344634
}
4635+
if GOARCH == "arm" && goarm < 7 && GOOS == "linux" && pc&0xffff0000 == 0xffff0000 {
4636+
// runtime/internal/atomic functions call into kernel
4637+
// helpers on arm < 7. See
4638+
// runtime/internal/atomic/sys_linux_arm.s.
4639+
cpuprof.lostAtomic++
4640+
return
4641+
}
46354642
}
46364643

46374644
// Profiling runs concurrently with GC, so it must not allocate.

0 commit comments

Comments
 (0)