diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2021-03-01 19:55:22 +0100 |
---|---|---|
committer | Tobias Klauser <tobias.klauser@gmail.com> | 2021-03-02 06:08:56 +0000 |
commit | ebb92dfed96fadb3c563ff11cead85bbb7536793 (patch) | |
tree | eed2b4258619c50f85431ba5f93a08d31b7346e8 | |
parent | 4c1a7ab49c4c68907bc7f7f7f776edd9116584a5 (diff) | |
download | go-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.go | 4 | ||||
-rw-r--r-- | src/runtime/netpoll.go | 9 |
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 |