summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wang Han <wanghan1995315@gmail.com> 2019-09-14 16:47:47 +0000
committer Orion Hodson <oth@google.com> 2019-09-17 03:44:18 +0000
commit3f43b9314da361811bb3cd258b28dff0fe56e7cc (patch)
treed4e5a326e06d8db06e42e8c7d81512ef6a256f7f
parent5012df2a3f16d62845182f225c92157e9bb64a27 (diff)
libartbase: Check kernel support for membarrier(2)
* Avoid logspam in dmesg on unsupported kernels. Change-Id: Iad18b1c93723fc8f21fa746fe6084232c4f5cc22
-rw-r--r--libartbase/base/membarrier.cc14
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