aboutsummaryrefslogtreecommitdiff
path: root/src/internal/syscall
diff options
context:
space:
mode:
authorKir Kolyshkin <kolyshkin@gmail.com>2025-09-03 16:12:39 -0700
committerKirill Kolyshkin <kolyshkin@gmail.com>2025-09-15 11:46:39 -0700
commit68c6a73380e82a0ea9a93c1a75ab8a38f28f3a3d (patch)
tree982a853333f6f068ef77bfb16d9cef97dac60a7c /src/internal/syscall
parente603e9834e83ec67f0dd39c4e77683eef0593946 (diff)
downloadgo-68c6a73380e82a0ea9a93c1a75ab8a38f28f3a3d.tar.xz
internal/syscall/unix: add KernelVersionGE
There are a few places in the code which checks that the running kernel is greater than or equal to x.y. The check takes a few lines and the checking code is somewhat distracting. Let's abstract this check into a simple function, KernelVersionGE, and convert the users accordingly. Add a test case (I'm not sure it has much value, can be dropped). Change-Id: I8ec91dcc7452363361f95e46794701c0ae57d956 Reviewed-on: https://go-review.googlesource.com/c/go/+/700796 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Damien Neil <dneil@google.com> Reviewed-by: Mark Freeman <markfreeman@google.com>
Diffstat (limited to 'src/internal/syscall')
-rw-r--r--src/internal/syscall/unix/kernel_version_freebsd.go6
-rw-r--r--src/internal/syscall/unix/kernel_version_ge.go13
-rw-r--r--src/internal/syscall/unix/kernel_version_ge_test.go67
-rw-r--r--src/internal/syscall/unix/kernel_version_solaris.go8
4 files changed, 87 insertions, 7 deletions
diff --git a/src/internal/syscall/unix/kernel_version_freebsd.go b/src/internal/syscall/unix/kernel_version_freebsd.go
index ef9ee136f3..db3519ddfb 100644
--- a/src/internal/syscall/unix/kernel_version_freebsd.go
+++ b/src/internal/syscall/unix/kernel_version_freebsd.go
@@ -42,7 +42,9 @@ func KernelVersion() (major, minor int) {
// This function will examine both the kernel version and the availability of the system call.
var SupportCopyFileRange = sync.OnceValue(func() bool {
// The copy_file_range() function first appeared in FreeBSD 13.0.
- major, _ := KernelVersion()
+ if !KernelVersionGE(13, 0) {
+ return false
+ }
_, err := CopyFileRange(0, nil, 0, nil, 0, 0)
- return major >= 13 && err != syscall.ENOSYS
+ return err != syscall.ENOSYS
})
diff --git a/src/internal/syscall/unix/kernel_version_ge.go b/src/internal/syscall/unix/kernel_version_ge.go
new file mode 100644
index 0000000000..a142404199
--- /dev/null
+++ b/src/internal/syscall/unix/kernel_version_ge.go
@@ -0,0 +1,13 @@
+// Copyright 2025 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package unix
+
+// KernelVersionGE checks if the running kernel version
+// is greater than or equal to the provided version.
+func KernelVersionGE(x, y int) bool {
+ xx, yy := KernelVersion()
+
+ return xx > x || (xx == x && yy >= y)
+}
diff --git a/src/internal/syscall/unix/kernel_version_ge_test.go b/src/internal/syscall/unix/kernel_version_ge_test.go
new file mode 100644
index 0000000000..f4b1b23cd2
--- /dev/null
+++ b/src/internal/syscall/unix/kernel_version_ge_test.go
@@ -0,0 +1,67 @@
+// Copyright 2025 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package unix_test
+
+import (
+ "internal/syscall/unix"
+ "testing"
+)
+
+func TestKernelVersionGE(t *testing.T) {
+ major, minor := unix.KernelVersion()
+ t.Logf("Running on kernel %d.%d", major, minor)
+
+ tests := []struct {
+ name string
+ x, y int
+ want bool
+ }{
+ {
+ name: "current version equals itself",
+ x: major,
+ y: minor,
+ want: true,
+ },
+ {
+ name: "older major version",
+ x: major - 1,
+ y: 0,
+ want: true,
+ },
+ {
+ name: "same major, older minor version",
+ x: major,
+ y: minor - 1,
+ want: true,
+ },
+ {
+ name: "newer major version",
+ x: major + 1,
+ y: 0,
+ want: false,
+ },
+ {
+ name: "same major, newer minor version",
+ x: major,
+ y: minor + 1,
+ want: false,
+ },
+ {
+ name: "min version (0.0)",
+ x: 0,
+ y: 0,
+ want: true,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := unix.KernelVersionGE(tt.x, tt.y)
+ if got != tt.want {
+ t.Errorf("KernelVersionGE(%d, %d): got %v, want %v", tt.x, tt.y, got, tt.want)
+ }
+ })
+ }
+}
diff --git a/src/internal/syscall/unix/kernel_version_solaris.go b/src/internal/syscall/unix/kernel_version_solaris.go
index 3f399411d7..7904e1f429 100644
--- a/src/internal/syscall/unix/kernel_version_solaris.go
+++ b/src/internal/syscall/unix/kernel_version_solaris.go
@@ -77,11 +77,10 @@ var SupportSockNonblockCloexec = sync.OnceValue(func() bool {
}
if err != syscall.EPROTONOSUPPORT && err != syscall.EINVAL {
// Something wrong with socket(), fall back to checking the kernel version.
- major, minor := KernelVersion()
if runtime.GOOS == "illumos" {
- return major > 5 || (major == 5 && minor >= 11) // minimal requirement is SunOS 5.11
+ return KernelVersionGE(5, 11) // Minimal requirement is SunOS 5.11.
}
- return major > 11 || (major == 11 && minor >= 4)
+ return KernelVersionGE(11, 4)
}
return false
})
@@ -101,6 +100,5 @@ var SupportAccept4 = sync.OnceValue(func() bool {
// SupportTCPKeepAliveIdleIntvlCNT determines whether the TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
// are available by checking the kernel version for Solaris 11.4.
var SupportTCPKeepAliveIdleIntvlCNT = sync.OnceValue(func() bool {
- major, minor := KernelVersion()
- return major > 11 || (major == 11 && minor >= 4)
+ return KernelVersionGE(11, 4)
})