From: Ian Lance Taylor Date: Tue, 7 Nov 2017 04:51:36 +0000 (-0800) Subject: runtime: only call netpoll if netpollinited returns true X-Git-Tag: go1.10beta1~363 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=86cd9c11764f16a2dcc551336e3aac7ad9f78d3c;p=gostls13.git runtime: only call netpoll if netpollinited returns true This fixes a race on old Linux kernels, in which we might temporarily set epfd to an invalid value other than -1. It's also the right thing to do. No test because the problem only occurs on old kernels. Fixes #22606 Change-Id: Id84bdd6ae6d7c5d47c39e97b74da27576cb51a54 Reviewed-on: https://go-review.googlesource.com/76319 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Dmitry Vyukov --- diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 112543db10..8adf3b2725 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1085,9 +1085,11 @@ func mhelpgc() { func startTheWorldWithSema(emitTraceEvent bool) int64 { _g_ := getg() - _g_.m.locks++ // disable preemption because it can be holding p in a local var - gp := netpoll(false) // non-blocking - injectglist(gp) + _g_.m.locks++ // disable preemption because it can be holding p in a local var + if netpollinited() { + gp := netpoll(false) // non-blocking + injectglist(gp) + } add := needaddgcproc() lock(&sched.lock) @@ -4237,7 +4239,7 @@ func sysmon() { // poll network if not polled for more than 10ms lastpoll := int64(atomic.Load64(&sched.lastpoll)) now := nanotime() - if lastpoll != 0 && lastpoll+10*1000*1000 < now { + if netpollinited() && lastpoll != 0 && lastpoll+10*1000*1000 < now { atomic.Cas64(&sched.lastpoll, uint64(lastpoll), uint64(now)) gp := netpoll(false) // non-blocking - returns list of goroutines if gp != nil {