Skip to content

Commit

Permalink
runtime: convert prof.hz to atomic type
Browse files Browse the repository at this point in the history
This converts several unsynchronized reads (reads without holding
prof.signalLock) into atomic reads.

For #53821.
For #52912.

Change-Id: I421b96a22fbe26d699bcc21010c8a9e0f4efc276
Reviewed-on: https://go-review.googlesource.com/c/go/+/420196
Reviewed-by: Austin Clements <[email protected]>
Run-TryBot: Michael Pratt <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
  • Loading branch information
prattmic committed Aug 12, 2022
1 parent 3121c2b commit 54cf1b1
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/runtime/cpuprof.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func (p *cpuProfile) add(tagPtr *unsafe.Pointer, stk []uintptr) {
osyield()
}

if prof.hz != 0 { // implies cpuprof.log != nil
if prof.hz.Load() != 0 { // implies cpuprof.log != nil
if p.numExtra > 0 || p.lostExtra > 0 || p.lostAtomic > 0 {
p.addExtra()
}
Expand Down
13 changes: 8 additions & 5 deletions src/runtime/proc.go
Original file line number Diff line number Diff line change
Expand Up @@ -4475,7 +4475,10 @@ func mcount() int32 {

var prof struct {
signalLock atomic.Uint32
hz int32

// Must hold signalLock to write. Reads may be lock-free, but
// signalLock should be taken to synchronize with changes.
hz atomic.Int32
}

func _System() { _System() }
Expand All @@ -4490,7 +4493,7 @@ func _VDSO() { _VDSO() }
//
//go:nowritebarrierrec
func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
if prof.hz == 0 {
if prof.hz.Load() == 0 {
return
}

Expand Down Expand Up @@ -4587,7 +4590,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
}
}

if prof.hz != 0 {
if prof.hz.Load() != 0 {
// Note: it can happen on Windows that we interrupted a system thread
// with no g, so gp could nil. The other nil checks are done out of
// caution, but not expected to be nil in practice.
Expand Down Expand Up @@ -4631,9 +4634,9 @@ func setcpuprofilerate(hz int32) {
for !prof.signalLock.CompareAndSwap(0, 1) {
osyield()
}
if prof.hz != hz {
if prof.hz.Load() != hz {
setProcessCPUProfiler(hz)
prof.hz = hz
prof.hz.Store(hz)
}
prof.signalLock.Store(0)

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/signal_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ var sigprofCallersUse uint32
//go:nosplit
//go:nowritebarrierrec
func sigprofNonGo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
if prof.hz != 0 {
if prof.hz.Load() != 0 {
c := &sigctxt{info, ctx}
// Some platforms (Linux) have per-thread timers, which we use in
// combination with the process-wide timer. Avoid double-counting.
Expand All @@ -525,7 +525,7 @@ func sigprofNonGo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
//go:nosplit
//go:nowritebarrierrec
func sigprofNonGoPC(pc uintptr) {
if prof.hz != 0 {
if prof.hz.Load() != 0 {
stk := []uintptr{
pc,
abi.FuncPCABIInternal(_ExternalCode) + sys.PCQuantum,
Expand Down

0 comments on commit 54cf1b1

Please sign in to comment.