Skip to content

Commit

Permalink
runtime/trace: fix tracing of blocking system calls
Browse files Browse the repository at this point in the history
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#12056

Change-Id: I8361e91aa3708f5053f98263dfe9feb8c5d1d969
Reviewed-on: https://go-review.googlesource.com/13861
Run-TryBot: Dmitry Vyukov <[email protected]>
Reviewed-by: Dmitry Vyukov <[email protected]>
  • Loading branch information
binarycrusader authored and dvyukov committed Sep 17, 2015
1 parent 3d1f8c2 commit 001a75a
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
12 changes: 8 additions & 4 deletions src/runtime/proc1.go
Original file line number Diff line number Diff line change
Expand Up @@ -1823,10 +1823,6 @@ func reentersyscall(pc, sp uintptr) {
// but can have inconsistent g->sched, do not let GC observe it.
_g_.m.locks++

if trace.enabled {
systemstack(traceGoSysCall)
}

// Entersyscall must not call any function that might split/grow the stack.
// (See details in comment above.)
// Catch calls that might, by replacing the stack guard with something that
Expand All @@ -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
systemstack(entersyscall_sysmon)
save(pc, sp)
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,7 @@ func traceGoUnpark(gp *g, skip int) {
}

func traceGoSysCall() {
traceEvent(traceEvGoSysCall, 4)
traceEvent(traceEvGoSysCall, 1)
}

func traceGoSysExit(seq uint64, ts int64) {
Expand Down

0 comments on commit 001a75a

Please sign in to comment.