diff options
Diffstat (limited to 'backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch')
-rw-r--r-- | backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch b/backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch new file mode 100644 index 0000000..134d88f --- /dev/null +++ b/backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch @@ -0,0 +1,79 @@ +From fef8644451930464ffd9f13c82bcd451f58fa575 Mon Sep 17 00:00:00 2001 +From: Andy Pan <panjf2000@gmail.com> +Date: Tue, 17 Oct 2023 22:38:17 +0800 +Subject: [PATCH 03/20] [release-branch.go1.21] internal/poll: add + SPLICE_F_NONBLOCK flag for splice to avoid inconsistency with O_NONBLOCK + +Fixes #63801 +Updates #59041 +Updates #63795 + +Conflict:NA +Reference:https://go-review.googlesource.com/c/go/+/536015 + +Details: https://github.com/golang/go/issues/59041#issuecomment-1766610087 + +Change-Id: Id3fc1df6d86b7c4cc383d09f9465fa8f4cc2a559 +Reviewed-on: https://go-review.googlesource.com/c/go/+/536015 +Reviewed-by: Bryan Mills <bcmills@google.com> +Reviewed-by: Ian Lance Taylor <iant@google.com> +LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> +Auto-Submit: Ian Lance Taylor <iant@google.com> +(cherry picked from commit 40cdf69fc9279ab28f84a6e0f965de8382c578fe) +Reviewed-on: https://go-review.googlesource.com/c/go/+/538117 +Auto-Submit: Heschi Kreinick <heschi@google.com> +Reviewed-by: Mauri de Souza Meneguzzo <mauri870@gmail.com> +Reviewed-by: Heschi Kreinick <heschi@google.com> +--- + src/internal/poll/splice_linux.go | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +diff --git a/src/internal/poll/splice_linux.go b/src/internal/poll/splice_linux.go +index 9505c5dcfc1e..72cca34fe4ae 100644 +--- a/src/internal/poll/splice_linux.go ++++ b/src/internal/poll/splice_linux.go +@@ -13,6 +13,12 @@ import ( + ) + + const ( ++ // spliceNonblock doesn't make the splice itself necessarily nonblocking ++ // (because the actual file descriptors that are spliced from/to may block ++ // unless they have the O_NONBLOCK flag set), but it makes the splice pipe ++ // operations nonblocking. ++ spliceNonblock = 0x2 ++ + // maxSpliceSize is the maximum amount of data Splice asks + // the kernel to move in a single call to splice(2). + // We use 1MB as Splice writes data through a pipe, and 1MB is the default maximum pipe buffer size, +@@ -89,7 +95,11 @@ func spliceDrain(pipefd int, sock *FD, max int) (int, error) { + return 0, err + } + for { +- n, err := splice(pipefd, sock.Sysfd, max, 0) ++ // In theory calling splice(2) with SPLICE_F_NONBLOCK could end up an infinite loop here, ++ // because it could return EAGAIN ceaselessly when the write end of the pipe is full, ++ // but this shouldn't be a concern here, since the pipe buffer must be sufficient for ++ // this data transmission on the basis of the workflow in Splice. ++ n, err := splice(pipefd, sock.Sysfd, max, spliceNonblock) + if err == syscall.EINTR { + continue + } +@@ -127,7 +137,14 @@ func splicePump(sock *FD, pipefd int, inPipe int) (int, error) { + } + written := 0 + for inPipe > 0 { +- n, err := splice(sock.Sysfd, pipefd, inPipe, 0) ++ // In theory calling splice(2) with SPLICE_F_NONBLOCK could end up an infinite loop here, ++ // because it could return EAGAIN ceaselessly when the read end of the pipe is empty, ++ // but this shouldn't be a concern here, since the pipe buffer must contain inPipe size of ++ // data on the basis of the workflow in Splice. ++ n, err := splice(sock.Sysfd, pipefd, inPipe, spliceNonblock) ++ if err == syscall.EINTR { ++ continue ++ } + // Here, the condition n == 0 && err == nil should never be + // observed, since Splice controls the write side of the pipe. + if n > 0 { +-- +2.33.0 + |