]> Cypherpunks repositories - gostls13.git/commitdiff
internal/poll: raise Linux's maxCopyFileRangeRound to MAX_RW_COUNT
authorAndy Pan <i@andypan.me>
Mon, 19 Aug 2024 06:06:40 +0000 (14:06 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 20 Aug 2024 16:39:43 +0000 (16:39 +0000)
Change-Id: I23c0c850ba57e7a49b78159d9293d1d25e1d2340
Reviewed-on: https://go-review.googlesource.com/c/go/+/606637
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Commit-Queue: Ian Lance Taylor <iant@golang.org>

src/internal/poll/copy_file_range_linux.go

index eda799893a5c3656f991e21eaca0787e5d565719..50b9f1bc08ce120613b378ad539553a3db4fd99a 100644 (file)
@@ -22,13 +22,19 @@ var isKernelVersionGE53 = sync.OnceValue(func() bool {
        return major > 5 || (major == 5 && minor >= 3)
 })
 
-const maxCopyFileRangeRound = 1 << 30
+// For best performance, call copy_file_range() with the largest len value
+// possible. Linux sets up a limitation of data transfer for most of its I/O
+// system calls, as MAX_RW_COUNT (INT_MAX & PAGE_MASK). This value equals to
+// the maximum integer value minus a page size that is typically 2^12=4096 bytes.
+// That is to say, it's the maximum integer value with the lowest 12 bits unset,
+// which is 0x7ffff000.
+const maxCopyFileRangeRound = 0x7ffff000
 
 func handleCopyFileRangeErr(err error, copied, written int64) (bool, error) {
        switch err {
        case syscall.ENOSYS:
                // copy_file_range(2) was introduced in Linux 4.5.
-               // Go supports Linux >= 2.6.33, so the system call
+               // Go supports Linux >= 3.2, so the system call
                // may not be present.
                //
                // If we see ENOSYS, we have certainly not transferred