mirror of
https://github.com/openjdk/jdk.git
synced 2026-07-19 23:48:50 +00:00
8348554: Enhance Linux kernel version checks
Reviewed-by: shade, fyang
This commit is contained in:
parent
002679ac9f
commit
a1fd5f4e88
@ -378,9 +378,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);
|
||||
@ -388,12 +389,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;
|
||||
|
||||
@ -91,7 +91,13 @@ class os::Linux {
|
||||
};
|
||||
|
||||
static int active_processor_count();
|
||||
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);
|
||||
|
||||
@ -66,11 +66,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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user