diff options
| author | Austin Clements <austin@google.com> | 2019-04-15 21:46:43 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2019-10-25 16:59:39 +0000 |
| commit | fc8eb264bba88b9e4eb85fa7560817abb25767f4 (patch) | |
| tree | 476b7857c584dc2d1da59a5d84670410b49aa14b /src/runtime | |
| parent | f82956b85bf7087b79b006018829423166b12afc (diff) | |
| download | go-fc8eb264bba88b9e4eb85fa7560817abb25767f4.tar.xz | |
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 <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/proc.go | 6 | ||||
| -rw-r--r-- | 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. |
