aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/proc.go
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2021-04-08 16:57:57 -0400
committerMichael Pratt <mpratt@google.com>2021-04-21 13:38:59 +0000
commit4d56576ec02e3e3b4459bc23eb1601e6e96f3cfc (patch)
tree14a21c857ae29690774e4073713c180ad2d9a28d /src/runtime/proc.go
parent381252f312a513a969d9aa1d84cec2c9c1becf4d (diff)
downloadgo-4d56576ec02e3e3b4459bc23eb1601e6e96f3cfc.tar.gz
go-4d56576ec02e3e3b4459bc23eb1601e6e96f3cfc.zip
runtime: move timer recheck after GC recheck
When rechecking for work after transitioning from a spinning to non-spinning M, checking timers before GC isn't useful. That is, if there is GC work available, it will run immediately and the updated pollUntil is unused. Move this check to just before netpoll, where pollUntil is used. While this technically improves efficiency in the (rare) case that we find GC work in this block, the primary motivation is simply to improve clarity by moving the update closer to use. For #43997 Change-Id: Ibc7fb308ac4a582875c200659c9e272121a89f3b Reviewed-on: https://go-review.googlesource.com/c/go/+/308654 Trust: Michael Pratt <mpratt@google.com> Trust: Michael Knyszek <mknyszek@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/proc.go')
-rw-r--r--src/runtime/proc.go16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index ef3b373b1c..b3f113f6ab 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -2810,13 +2810,7 @@ top:
goto top
}
- // Similar to above, check for timer creation or expiry concurrently with
- // transitioning from spinning to non-spinning. Note that we cannot use
- // checkTimers here because it calls adjusttimers which may need to allocate
- // memory, and that isn't allowed when we don't have an active P.
- pollUntil = checkTimersNoP(allpSnapshot, timerpMaskSnapshot, pollUntil)
-
- // Finally, check for idle-priority GC work.
+ // Check for idle-priority GC work again.
_p_, gp = checkIdleGCNoP()
if _p_ != nil {
acquirep(_p_)
@@ -2834,6 +2828,14 @@ top:
return gp, false
}
+ // Finally, check for timer creation or expiry concurrently with
+ // transitioning from spinning to non-spinning.
+ //
+ // Note that we cannot use checkTimers here because it calls
+ // adjusttimers which may need to allocate memory, and that isn't
+ // allowed when we don't have an active P.
+ pollUntil = checkTimersNoP(allpSnapshot, timerpMaskSnapshot, pollUntil)
+
// Poll network until next timer.
if netpollinited() && (atomic.Load(&netpollWaiters) > 0 || pollUntil != 0) && atomic.Xchg64(&sched.lastpoll, 0) != 0 {
atomic.Store64(&sched.pollUntil, uint64(pollUntil))