From: Austin Clements Date: Tue, 16 Apr 2019 01:46:43 +0000 (-0400) Subject: runtime: ensure _Grunning Gs have a valid g.m and g.m.p X-Git-Tag: go1.14beta1~581 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=fc8eb264bba88b9e4eb85fa7560817abb25767f4;p=gostls13.git runtime: ensure _Grunning Gs have a valid g.m and g.m.p We already claim on the documentation for _Grunning that this is case, but execute transitions to _Grunning before assigning g.m. Fix this and make the documentation even more explicit. For #10958, #24543, but also a good cleanup. Change-Id: I1eb0108e7762f55cfb0282aca624af1c0a15fe56 Reviewed-on: https://go-review.googlesource.com/c/go/+/201440 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 4814a5fc87..524d75e3c7 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -2177,6 +2177,10 @@ func gcstopm() { func execute(gp *g, inheritTime bool) { _g_ := getg() + // Assign gp.m before entering _Grunning so running Gs have an + // M. + _g_.m.curg = gp + gp.m = _g_.m casgstatus(gp, _Grunnable, _Grunning) gp.waitsince = 0 gp.preempt = false @@ -2184,8 +2188,6 @@ func execute(gp *g, inheritTime bool) { if !inheritTime { _g_.m.p.ptr().schedtick++ } - _g_.m.curg = gp - gp.m = _g_.m // Check whether the profiler needs to be turned on or off. hz := sched.profilehz diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index aebc9af06f..c5023027be 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -40,7 +40,7 @@ const ( // _Grunning means this goroutine may execute user code. The // stack is owned by this goroutine. It is not on a run queue. - // It is assigned an M and a P. + // It is assigned an M and a P (g.m and g.m.p are valid). _Grunning // 2 // _Gsyscall means this goroutine is executing a system call.