]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/trace: fix tracing of blocking system calls
authorShawn Walker-Salas <shawn.walker@oracle.com>
Tue, 18 Aug 2015 21:13:38 +0000 (14:13 -0700)
committerDmitry Vyukov <dvyukov@google.com>
Thu, 17 Sep 2015 09:06:20 +0000 (09:06 +0000)
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>
src/runtime/proc1.go
src/runtime/trace.go

index 35d9e86e8e8ab18bd8fce3abccbcca12b420ed87..4ffe11b653100e2e7e73ab265ceff9aa273a01b6 100644 (file)
@@ -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
@@ -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)
index 29600b5c4dd795f90b6b12381fdacd48980cee19..6631bc29d1bcf948c70e2bc31db7f80813eaf699 100644 (file)
@@ -828,7 +828,7 @@ func traceGoUnpark(gp *g, skip int) {
 }
 
 func traceGoSysCall() {
-       traceEvent(traceEvGoSysCall, 4)
+       traceEvent(traceEvGoSysCall, 1)
 }
 
 func traceGoSysExit(seq uint64, ts int64) {