From: Ian Lance Taylor Date: Mon, 23 Mar 2020 18:38:49 +0000 (-0700) Subject: [release-branch.go1.14] runtime: don't call wakeNetPoller during timerModifying X-Git-Tag: go1.14.2~14 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ca153f4db7e40f151dbd02081c0814194342428a;p=gostls13.git [release-branch.go1.14] runtime: don't call wakeNetPoller during timerModifying Reduce the length of time that other timer functions can see timerModifying. In particular avoid system calls. For #38023 Fixes #38051 Change-Id: I1b61229c668e6085d9ee6dca9488a90055386c36 Reviewed-on: https://go-review.googlesource.com/c/go/+/224902 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek (cherry picked from commit 355f53f0a0a5d79032068d4914d7aea3435084ec) Reviewed-on: https://go-review.googlesource.com/c/go/+/225277 --- diff --git a/src/runtime/time.go b/src/runtime/time.go index 93565cf369..ed73bf7374 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -245,11 +245,6 @@ func addtimer(t *timer) { } t.status = timerWaiting - addInitializedTimer(t) -} - -// addInitializedTimer adds an initialized timer to the current P. -func addInitializedTimer(t *timer) { when := t.when pp := getg().m.p.ptr() @@ -262,7 +257,6 @@ func addInitializedTimer(t *timer) { } // doaddtimer adds t to the current P's heap. -// It reports whether it saw no problems due to races. // The caller must have locked the timers for pp. func doaddtimer(pp *p, t *timer) { // Timers rely on the network poller, so make sure the poller @@ -437,10 +431,14 @@ loop: if wasRemoved { t.when = when - addInitializedTimer(t) + pp := getg().m.p.ptr() + lock(&pp.timersLock) + doaddtimer(pp, t) + unlock(&pp.timersLock) if !atomic.Cas(&t.status, timerModifying, timerWaiting) { badTimer() } + wakeNetPoller(when) } else { // The timer is in some other P's heap, so we can't change // the when field. If we did, the other P's heap would