components/golang/patches/0501-I8361e91aa3708f5053f98263dfe9feb8c5d1d969.patch
changeset 5331 9c955076ffe3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/golang/patches/0501-I8361e91aa3708f5053f98263dfe9feb8c5d1d969.patch	Thu Jan 21 09:20:59 2016 -0800
@@ -0,0 +1,65 @@
+commit 001a75a74c4a27901b0b536efe1be581612c52a9
+Author: Shawn Walker-Salas <[email protected]>
+Date:   Tue Aug 18 14:13:38 2015 -0700
+
+    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 <[email protected]>
+    Reviewed-by: Dmitry Vyukov <[email protected]>
+
+diff --git a/src/runtime/proc1.go b/src/runtime/proc1.go
+index 35d9e86..4ffe11b 100644
+--- a/src/runtime/proc1.go
++++ b/src/runtime/proc1.go
+@@ -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)
+diff --git a/src/runtime/trace.go b/src/runtime/trace.go
+index 29600b5..6631bc2 100644
+--- a/src/runtime/trace.go
++++ b/src/runtime/trace.go
+@@ -828,7 +828,7 @@ func traceGoUnpark(gp *g, skip int) {
+ }
+ 
+ func traceGoSysCall() {
+-	traceEvent(traceEvGoSysCall, 4)
++	traceEvent(traceEvGoSysCall, 1)
+ }
+ 
+ func traceGoSysExit(seq uint64, ts int64) {