mirror of
https://github.com/golang/go
synced 2024-11-11 22:50:22 -07:00
runtime: fix G passed to schedEnabled and cleanup
exitsyscall0 contains two G variables: _g_ and gp. _g_ is the active G, g0, while gp is the G to run (which just exited from a syscall). It is passing _g_ to schedEnabled, which is incorrect; we are about to execute gp, so that is what we should be checking the schedulability of. While this is incorrect and should be fixed, I don't think it has ever caused a problem in practice: * g0 does not have g.startpc set, so schedEnabled simplifies to just !sched.disable.user. * This is correct provided gp is never a system goroutine. * As far as I know, system goroutines never use entersyscall / exitsyscall. As far I can tell, this was a simple copy/paste error from exitsyscall, where variable _g_ is the G to run. While we are here, eliminate _g_ entirely, as the one other use is identical to using gp. Change-Id: I5df98a34569238b89ab13ff7012cd756fefb10dc Reviewed-on: https://go-review.googlesource.com/c/go/+/291329 Trust: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
e0ce0af6ef
commit
4b1a24f3cd
@ -3856,15 +3856,15 @@ func exitsyscallfast_pidle() bool {
|
||||
// exitsyscall slow path on g0.
|
||||
// Failed to acquire P, enqueue gp as runnable.
|
||||
//
|
||||
// Called via mcall, so gp is the calling g from this M.
|
||||
//
|
||||
//go:nowritebarrierrec
|
||||
func exitsyscall0(gp *g) {
|
||||
_g_ := getg()
|
||||
|
||||
casgstatus(gp, _Gsyscall, _Grunnable)
|
||||
dropg()
|
||||
lock(&sched.lock)
|
||||
var _p_ *p
|
||||
if schedEnabled(_g_) {
|
||||
if schedEnabled(gp) {
|
||||
_p_ = pidleget()
|
||||
}
|
||||
if _p_ == nil {
|
||||
@ -3878,8 +3878,11 @@ func exitsyscall0(gp *g) {
|
||||
acquirep(_p_)
|
||||
execute(gp, false) // Never returns.
|
||||
}
|
||||
if _g_.m.lockedg != 0 {
|
||||
if gp.lockedm != 0 {
|
||||
// Wait until another thread schedules gp and so m again.
|
||||
//
|
||||
// N.B. lockedm must be this M, as this g was running on this M
|
||||
// before entersyscall.
|
||||
stoplockedm()
|
||||
execute(gp, false) // Never returns.
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user