Skip to content

Commit

Permalink
runtime: drop SIGPROF while in ARM < 7 kernel helpers
Browse files Browse the repository at this point in the history
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 golang#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]>
  • Loading branch information
prattmic committed Aug 13, 2021
1 parent 4c8ffb3 commit 20a620f
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/runtime/proc.go
Original file line number Diff line number Diff line change
Expand Up @@ -4619,7 +4619,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
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
Expand All @@ -4632,6 +4632,13 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
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
}
}

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

0 comments on commit 20a620f

Please sign in to comment.