diff options
| author | Kir Kolyshkin <kolyshkin@gmail.com> | 2025-09-03 16:12:39 -0700 |
|---|---|---|
| committer | Kirill Kolyshkin <kolyshkin@gmail.com> | 2025-09-15 11:46:39 -0700 |
| commit | 68c6a73380e82a0ea9a93c1a75ab8a38f28f3a3d (patch) | |
| tree | 982a853333f6f068ef77bfb16d9cef97dac60a7c /src/internal/syscall | |
| parent | e603e9834e83ec67f0dd39c4e77683eef0593946 (diff) | |
| download | go-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')
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) }) |
