diff options
author | 2024-10-31 16:21:45 +0000 | |
---|---|---|
committer | 2024-12-19 17:27:36 +0000 | |
commit | f9a04e35ce5dbd1b3cf5704ac7574ec4d537aeaa (patch) | |
tree | 053ea8af257f501120b91236480c18f6daee5257 /libartbase/base/utils.cc | |
parent | 3df940f58e08880c9537870de56d5f876eac439f (diff) |
Also use two-step mmap allocation on target if 'addr' hint is provided.
The issues isn't Ubuntu specific. All new kernels are affected.
The hint isn't ignored intentionally by the kernel.
It is unintended side effect of other changes.
Bug: 373931708
Test: m
Change-Id: I5060f69a41c59d61065343fe28d394757adaa061
Diffstat (limited to 'libartbase/base/utils.cc')
-rw-r--r-- | libartbase/base/utils.cc | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/libartbase/base/utils.cc b/libartbase/base/utils.cc index 2c95986809..aca7a0d47d 100644 --- a/libartbase/base/utils.cc +++ b/libartbase/base/utils.cc @@ -167,12 +167,17 @@ bool FlushCpuCaches(void* begin, void* end) { #if defined(__linux__) bool IsKernelVersionAtLeast(int reqd_major, int reqd_minor) { - struct utsname uts; - int major, minor; - CHECK_EQ(uname(&uts), 0); - CHECK_EQ(strcmp(uts.sysname, "Linux"), 0); - CHECK_EQ(sscanf(uts.release, "%d.%d:", &major, &minor), 2); - return major > reqd_major || (major == reqd_major && minor >= reqd_minor); + static auto version = []() -> std::pair<int, int> { + struct utsname uts; + int res, major, minor; + res = uname(&uts); + CHECK_EQ(res, 0); + CHECK_EQ(strcmp(uts.sysname, "Linux"), 0); + res = sscanf(uts.release, "%d.%d:", &major, &minor); + CHECK_EQ(res, 2); + return std::make_pair(major, minor); + }(); + return version >= std::make_pair(reqd_major, reqd_minor); } #endif |