mirror of
https://github.com/golang/go
synced 2024-11-18 05:04:47 -07:00
runtime/trace: fix tracing of blocking system calls
The placement and invocation of traceGoSysCall when using entersyscallblock() instead of entersyscall() differs enough that the TestTraceSymbolize test can fail on some platforms. This change moves the invocation of traceGoSysCall for entersyscall() so that the same number of "frames to skip" are present in the trace as when entersyscallblock() is used ensuring system call traces remain identical regardless of internal implementation choices. Fixes golang/go#12056 Change-Id: I8361e91aa3708f5053f98263dfe9feb8c5d1d969 Reviewed-on: https://go-review.googlesource.com/13861 Run-TryBot: Dmitry Vyukov <dvyukov@google.com> Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
parent
3d1f8c2379
commit
001a75a74c
@ -1823,10 +1823,6 @@ func reentersyscall(pc, sp uintptr) {
|
|||||||
// but can have inconsistent g->sched, do not let GC observe it.
|
// but can have inconsistent g->sched, do not let GC observe it.
|
||||||
_g_.m.locks++
|
_g_.m.locks++
|
||||||
|
|
||||||
if trace.enabled {
|
|
||||||
systemstack(traceGoSysCall)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entersyscall must not call any function that might split/grow the stack.
|
// Entersyscall must not call any function that might split/grow the stack.
|
||||||
// (See details in comment above.)
|
// (See details in comment above.)
|
||||||
// Catch calls that might, by replacing the stack guard with something that
|
// Catch calls that might, by replacing the stack guard with something that
|
||||||
@ -1846,6 +1842,14 @@ func reentersyscall(pc, sp uintptr) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if trace.enabled {
|
||||||
|
systemstack(traceGoSysCall)
|
||||||
|
// systemstack itself clobbers g.sched.{pc,sp} and we might
|
||||||
|
// need them later when the G is genuinely blocked in a
|
||||||
|
// syscall
|
||||||
|
save(pc, sp)
|
||||||
|
}
|
||||||
|
|
||||||
if atomicload(&sched.sysmonwait) != 0 { // TODO: fast atomic
|
if atomicload(&sched.sysmonwait) != 0 { // TODO: fast atomic
|
||||||
systemstack(entersyscall_sysmon)
|
systemstack(entersyscall_sysmon)
|
||||||
save(pc, sp)
|
save(pc, sp)
|
||||||
|
@ -828,7 +828,7 @@ func traceGoUnpark(gp *g, skip int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func traceGoSysCall() {
|
func traceGoSysCall() {
|
||||||
traceEvent(traceEvGoSysCall, 4)
|
traceEvent(traceEvGoSysCall, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func traceGoSysExit(seq uint64, ts int64) {
|
func traceGoSysExit(seq uint64, ts int64) {
|
||||||
|
Loading…
Reference in New Issue
Block a user