18 Star 1 Fork 19

src-openEuler/openjdk-21

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Backport-JDK-8348554-Enhance-Linux-kernel-version-ch.patch 3.88 KB
一键复制 编辑 原始数据 按行查看 历史
From 2565e265b0381ed00428d33fc8040d9367ee394d Mon Sep 17 00:00:00 2001
From: Dingli Zhang <dingli@iscas.ac.cn>
Date: Mon, 17 Mar 2025 16:31:03 +0800
Subject: [PATCH] Backport JDK-8348554: Enhance Linux kernel version checks
diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp
index 7cb862d7c3e..22216a568bc 100644
--- a/src/hotspot/os/linux/os_linux.cpp
+++ b/src/hotspot/os/linux/os_linux.cpp
@@ -311,9 +311,10 @@ static void next_line(FILE *f) {
} while (c != '\n' && c != EOF);
}
-void os::Linux::kernel_version(long* major, long* minor) {
- *major = -1;
- *minor = -1;
+void os::Linux::kernel_version(long* major, long* minor, long* patch) {
+ *major = 0;
+ *minor = 0;
+ *patch = 0;
struct utsname buffer;
int ret = uname(&buffer);
@@ -321,12 +322,29 @@ void os::Linux::kernel_version(long* major, long* minor) {
log_warning(os)("uname(2) failed to get kernel version: %s", os::errno_name(ret));
return;
}
- int nr_matched = sscanf(buffer.release, "%ld.%ld", major, minor);
- if (nr_matched != 2) {
- log_warning(os)("Parsing kernel version failed, expected 2 version numbers, only matched %d", nr_matched);
+ int nr_matched = sscanf(buffer.release, "%ld.%ld.%ld", major, minor, patch);
+ if (nr_matched != 3) {
+ log_warning(os)("Parsing kernel version failed, expected 3 version numbers, only matched %d", nr_matched);
}
}
+int os::Linux::kernel_version_compare(long major1, long minor1, long patch1,
+ long major2, long minor2, long patch2) {
+ // Compare major versions
+ if (major1 > major2) return 1;
+ if (major1 < major2) return -1;
+
+ // Compare minor versions
+ if (minor1 > minor2) return 1;
+ if (minor1 < minor2) return -1;
+
+ // Compare patchlevel versions
+ if (patch1 > patch2) return 1;
+ if (patch1 < patch2) return -1;
+
+ return 0;
+}
+
bool os::Linux::get_tick_information(CPUPerfTicks* pticks, int which_logical_cpu) {
FILE* fh;
uint64_t userTicks, niceTicks, systemTicks, idleTicks;
diff --git a/src/hotspot/os/linux/os_linux.hpp b/src/hotspot/os/linux/os_linux.hpp
index 029f2aa7a52..f2901480d29 100644
--- a/src/hotspot/os/linux/os_linux.hpp
+++ b/src/hotspot/os/linux/os_linux.hpp
@@ -109,7 +109,13 @@ class os::Linux {
bool has_steal_ticks;
};
- static void kernel_version(long* major, long* minor);
+ static void kernel_version(long* major, long* minor, long* patch);
+
+ // If kernel1 > kernel2 return 1
+ // If kernel1 < kernel2 return -1
+ // If kernel1 = kernel2 return 0
+ static int kernel_version_compare(long major1, long minor1, long patch1,
+ long major2, long minor2, long patch2);
// which_logical_cpu=-1 returns accumulated ticks for all cpus.
static bool get_tick_information(CPUPerfTicks* pticks, int which_logical_cpu);
diff --git a/src/hotspot/os/linux/systemMemoryBarrier_linux.cpp b/src/hotspot/os/linux/systemMemoryBarrier_linux.cpp
index 51397b139d8..43122a58bce 100644
--- a/src/hotspot/os/linux/systemMemoryBarrier_linux.cpp
+++ b/src/hotspot/os/linux/systemMemoryBarrier_linux.cpp
@@ -76,11 +76,11 @@ bool LinuxSystemMemoryBarrier::initialize() {
// RISCV port was introduced in kernel 4.4.
// 4.4 also made membar private expedited mandatory.
// But RISCV actually don't support it until 6.9.
- long major, minor;
- os::Linux::kernel_version(&major, &minor);
- if (!(major > 6 || (major == 6 && minor >= 9))) {
- log_info(os)("Linux kernel %ld.%ld does not support MEMBARRIER PRIVATE_EXPEDITED on RISC-V.",
- major, minor);
+ long major, minor, patch;
+ os::Linux::kernel_version(&major, &minor, &patch);
+ if (os::Linux::kernel_version_compare(major, minor, patch, 6, 9, 0) == -1) {
+ log_info(os)("Linux kernel %ld.%ld.%ld does not support MEMBARRIER PRIVATE_EXPEDITED on RISC-V.",
+ major, minor, patch);
return false;
}
#endif
--
2.34.1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/openjdk-21.git
git@gitee.com:src-openeuler/openjdk-21.git
src-openeuler
openjdk-21
openjdk-21
master

搜索帮助