diff options
| author | 2019-09-14 16:47:47 +0000 | |
|---|---|---|
| committer | 2019-09-17 03:44:18 +0000 | |
| commit | 3f43b9314da361811bb3cd258b28dff0fe56e7cc (patch) | |
| tree | d4e5a326e06d8db06e42e8c7d81512ef6a256f7f | |
| parent | 5012df2a3f16d62845182f225c92157e9bb64a27 (diff) | |
libartbase: Check kernel support for membarrier(2)
* Avoid logspam in dmesg on unsupported kernels.
Change-Id: Iad18b1c93723fc8f21fa746fe6084232c4f5cc22
| -rw-r--r-- | libartbase/base/membarrier.cc | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/libartbase/base/membarrier.cc b/libartbase/base/membarrier.cc index abb36bcaa9..48f47dff44 100644 --- a/libartbase/base/membarrier.cc +++ b/libartbase/base/membarrier.cc @@ -17,9 +17,11 @@ #include "membarrier.h" #include <errno.h> +#include <stdio.h> #if !defined(_WIN32) #include <sys/syscall.h> +#include <sys/utsname.h> #include <unistd.h> #endif #include "macros.h" @@ -46,6 +48,18 @@ namespace art { #if defined(__NR_membarrier) int membarrier(MembarrierCommand command) { + // Check kernel version supports membarrier(2). + static constexpr int kRequiredMajor = 4; + static constexpr int kRequiredMinor = 16; + struct utsname uts; + int major, minor; + if (uname(&uts) != 0 || + strcmp(uts.sysname, "Linux") != 0 || + sscanf(uts.release, "%d.%d", &major, &minor) != 2 || + (major < kRequiredMajor || (major == kRequiredMajor && minor < kRequiredMinor))) { + errno = ENOSYS; + return -1; + } #if defined(__BIONIC__) // Avoid calling membarrier on older Android versions where membarrier may be barred by secomp // causing the current process to be killed. The probing here could be considered expensive so |