From a2c2f06cad8aa722120cb73e965d168bfcb4d977 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 17 Aug 2022 22:21:23 +0200 Subject: [PATCH] internal/poll: remove detection of buggy splice on old Linux versions The splice syscall is buggy prior to Linux 2.6.29. CL 113999 added a workaround to detect buggy versions and disable use of splice for these. As of Go 1.18 the minumum Linux version is 2.6.32. Thus, a non-buggy implementation of the splice syscall can be assumed. For #45964 Fixes #54505 Change-Id: Ied3a3334da7a3f7fa1280b7c5b1dfb9030219336 Reviewed-on: https://go-review.googlesource.com/c/go/+/422979 Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Tobias Klauser Run-TryBot: Tobias Klauser Reviewed-by: Dmitri Shuralyov Reviewed-by: Dmitri Shuralyov --- src/internal/poll/splice_linux.go | 35 +++---------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/src/internal/poll/splice_linux.go b/src/internal/poll/splice_linux.go index 43eec04a71..6e1a71fa5b 100644 --- a/src/internal/poll/splice_linux.go +++ b/src/internal/poll/splice_linux.go @@ -5,10 +5,8 @@ package poll import ( - "internal/syscall/unix" "runtime" "sync" - "sync/atomic" "syscall" "unsafe" ) @@ -207,40 +205,13 @@ func putPipe(p *splicePipe) { splicePipePool.Put(p) } -var disableSplice unsafe.Pointer - // newPipe sets up a pipe for a splice operation. -func newPipe() (sp *splicePipe) { - p := (*bool)(atomic.LoadPointer(&disableSplice)) - if p != nil && *p { - return nil - } - +func newPipe() *splicePipe { var fds [2]int - // pipe2 was added in 2.6.27 and our minimum requirement is 2.6.23, so it - // might not be implemented. Falling back to pipe is possible, but prior to - // 2.6.29 splice returns -EAGAIN instead of 0 when the connection is - // closed. - const flags = syscall.O_CLOEXEC | syscall.O_NONBLOCK - if err := syscall.Pipe2(fds[:], flags); err != nil { + if err := syscall.Pipe2(fds[:], syscall.O_CLOEXEC|syscall.O_NONBLOCK); err != nil { return nil } - - sp = &splicePipe{splicePipeFields: splicePipeFields{rfd: fds[0], wfd: fds[1]}} - - if p == nil { - p = new(bool) - defer atomic.StorePointer(&disableSplice, unsafe.Pointer(p)) - - // F_GETPIPE_SZ was added in 2.6.35, which does not have the -EAGAIN bug. - if _, _, errno := syscall.Syscall(unix.FcntlSyscall, uintptr(fds[0]), syscall.F_GETPIPE_SZ, 0); errno != 0 { - *p = true - destroyPipe(sp) - return nil - } - } - - return + return &splicePipe{splicePipeFields: splicePipeFields{rfd: fds[0], wfd: fds[1]}} } // destroyPipe destroys a pipe. -- 2.50.0