mirror of https://github.com/golang/go.git
runtime: normalize sigprof traceback flags
Each gentraceback call uses a different set of flags. Combine these into a common variable, only adjusted as necessary. The effective changes here are: * cgo traceback now has _TraceJumpStack. This is a no-op since it already passes curg. * libcall traceback now has _TraceJumpStack. This is a behavior change and will allow following stack transitions if a libcall is performed on g0. * VDSO traceback drops _TraceTrap. vdsoPC is a return address, so _TraceTrap was not necessary. Change-Id: I351b3cb8dc77df7466795d5fbf2bd8f30bba2d37 Reviewed-on: https://go-review.googlesource.com/c/go/+/358900 Trust: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
266626211e
commit
2bc8ed8e9c
|
|
@ -4645,6 +4645,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
getg().m.mallocing++
|
getg().m.mallocing++
|
||||||
|
|
||||||
var stk [maxCPUProfStack]uintptr
|
var stk [maxCPUProfStack]uintptr
|
||||||
|
flags := uint(_TraceJumpStack)
|
||||||
n := 0
|
n := 0
|
||||||
if mp.ncgo > 0 && mp.curg != nil && mp.curg.syscallpc != 0 && mp.curg.syscallsp != 0 {
|
if mp.ncgo > 0 && mp.curg != nil && mp.curg.syscallpc != 0 && mp.curg.syscallsp != 0 {
|
||||||
cgoOff := 0
|
cgoOff := 0
|
||||||
|
|
@ -4662,12 +4663,12 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect Go stack that leads to the cgo call.
|
// Collect Go stack that leads to the cgo call.
|
||||||
n = gentraceback(mp.curg.syscallpc, mp.curg.syscallsp, 0, mp.curg, 0, &stk[cgoOff], len(stk)-cgoOff, nil, nil, 0)
|
n = gentraceback(mp.curg.syscallpc, mp.curg.syscallsp, 0, mp.curg, 0, &stk[cgoOff], len(stk)-cgoOff, nil, nil, flags)
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
n += cgoOff
|
n += cgoOff
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
n = gentraceback(pc, sp, lr, gp, 0, &stk[0], len(stk), nil, nil, _TraceTrap|_TraceJumpStack)
|
n = gentraceback(pc, sp, lr, gp, 0, &stk[0], len(stk), nil, nil, _TraceTrap|flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n <= 0 {
|
if n <= 0 {
|
||||||
|
|
@ -4677,10 +4678,10 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
if usesLibcall() && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 {
|
if usesLibcall() && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 {
|
||||||
// Libcall, i.e. runtime syscall on windows.
|
// Libcall, i.e. runtime syscall on windows.
|
||||||
// Collect Go stack that leads to the call.
|
// Collect Go stack that leads to the call.
|
||||||
n = gentraceback(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), 0, &stk[0], len(stk), nil, nil, 0)
|
n = gentraceback(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), 0, &stk[0], len(stk), nil, nil, flags)
|
||||||
}
|
}
|
||||||
if n == 0 && mp != nil && mp.vdsoSP != 0 {
|
if n == 0 && mp != nil && mp.vdsoSP != 0 {
|
||||||
n = gentraceback(mp.vdsoPC, mp.vdsoSP, 0, gp, 0, &stk[0], len(stk), nil, nil, _TraceTrap|_TraceJumpStack)
|
n = gentraceback(mp.vdsoPC, mp.vdsoSP, 0, gp, 0, &stk[0], len(stk), nil, nil, flags)
|
||||||
}
|
}
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
// If all of the above has failed, account it against abstract "System" or "GC".
|
// If all of the above has failed, account it against abstract "System" or "GC".
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue