]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix G passed to schedEnabled and cleanup
authorMichael Pratt <mpratt@google.com>
Thu, 11 Feb 2021 15:44:34 +0000 (10:44 -0500)
committerMichael Pratt <mpratt@google.com>
Tue, 30 Mar 2021 21:43:12 +0000 (21:43 +0000)
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>
src/runtime/proc.go

index d868c596bfadc2bc99267c7e100c9295ad0893d9..2a7a766b25b053aef3102623009d44169c1c3b22 100644 (file)
@@ -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.
        }