aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2021-03-01 19:55:22 +0100
committerTobias Klauser <tobias.klauser@gmail.com>2021-03-02 06:08:56 +0000
commitebb92dfed96fadb3c563ff11cead85bbb7536793 (patch)
treeeed2b4258619c50f85431ba5f93a08d31b7346e8
parent4c1a7ab49c4c68907bc7f7f7f776edd9116584a5 (diff)
downloadgo-ebb92dfed96fadb3c563ff11cead85bbb7536793.tar.gz
go-ebb92dfed96fadb3c563ff11cead85bbb7536793.zip
internal/poll, runtime: handle netpollopen error in poll_runtime_pollOpen
When netpollopen in poll_runtime_pollOpen returns an error, the work in runtime_pollUnblock and runtime_pollClose can be avoided since the underlying system call to set up the poller failed. E.g. on linux, this avoids calling netpollclose and thus epoll_ctl(fd, EPOLL_CTL_DEL, ...) in case the file does not support epoll, i.e. epoll_ctl(fd, EPOLL_CTL_ADD, ...) in netpollopen failed. Fixes #44552 Change-Id: I564d90340fd1ab3a6490526353616a447ae0cfb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/297392 Trust: Tobias Klauser <tobias.klauser@gmail.com> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/internal/poll/fd_poll_runtime.go4
-rw-r--r--src/runtime/netpoll.go9
2 files changed, 6 insertions, 7 deletions
diff --git a/src/internal/poll/fd_poll_runtime.go b/src/internal/poll/fd_poll_runtime.go
index beb0f7d6a6..b072af00ea 100644
--- a/src/internal/poll/fd_poll_runtime.go
+++ b/src/internal/poll/fd_poll_runtime.go
@@ -39,10 +39,6 @@ func (pd *pollDesc) init(fd *FD) error {
serverInit.Do(runtime_pollServerInit)
ctx, errno := runtime_pollOpen(uintptr(fd.Sysfd))
if errno != 0 {
- if ctx != 0 {
- runtime_pollUnblock(ctx)
- runtime_pollClose(ctx)
- }
return errnoErr(syscall.Errno(errno))
}
pd.runtimeCtx = ctx
diff --git a/src/runtime/netpoll.go b/src/runtime/netpoll.go
index afb208a455..202aef593f 100644
--- a/src/runtime/netpoll.go
+++ b/src/runtime/netpoll.go
@@ -162,9 +162,12 @@ func poll_runtime_pollOpen(fd uintptr) (*pollDesc, int) {
pd.self = pd
unlock(&pd.lock)
- var errno int32
- errno = netpollopen(fd, pd)
- return pd, int(errno)
+ errno := netpollopen(fd, pd)
+ if errno != 0 {
+ pollcache.free(pd)
+ return nil, int(errno)
+ }
+ return pd, 0
}
//go:linkname poll_runtime_pollClose internal/poll.runtime_pollClose