From fc8eb264bba88b9e4eb85fa7560817abb25767f4 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 15 Apr 2019 21:46:43 -0400 Subject: [PATCH] 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 --- src/runtime/proc.go | 6 ++++-- src/runtime/runtime2.go | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) 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. -- 2.50.0