summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-10-31 15:51:22 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-10-31 15:51:22 +0000
commita7add488ae63fc2574dda97791cbc65fe67f7771 (patch)
tree3365dabc368cd4a0805efa533501ad6194d37ba1 /compiler-rt/lib
parent3a9632d54407d67df62271f984ff1e02172194cd (diff)
downloadbcm5719-llvm-a7add488ae63fc2574dda97791cbc65fe67f7771.tar.gz
bcm5719-llvm-a7add488ae63fc2574dda97791cbc65fe67f7771.zip
[msan] Disable mlock/mlockall to work around a linux kernel bug.
The same logic is present in ASan and TSan. llvm-svn: 193755
Diffstat (limited to 'compiler-rt/lib')
-rw-r--r--compiler-rt/lib/msan/msan_interceptors.cc29
-rw-r--r--compiler-rt/lib/msan/tests/msan_test.cc7
2 files changed, 36 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc
index 360d5a19453..8c867c3bcde 100644
--- a/compiler-rt/lib/msan/msan_interceptors.cc
+++ b/compiler-rt/lib/msan/msan_interceptors.cc
@@ -1172,6 +1172,35 @@ INTERCEPTOR(void *, shmat, int shmid, const void *shmaddr, int shmflg) {
return p;
}
+// Linux kernel has a bug that leads to kernel deadlock if a process
+// maps TBs of memory and then calls mlock().
+static void MlockIsUnsupported() {
+ static atomic_uint8_t printed;
+ if (atomic_exchange(&printed, 1, memory_order_relaxed))
+ return;
+ if (common_flags()->verbosity > 0)
+ Printf("INFO: MemorySanitizer ignores mlock/mlockall/munlock/munlockall\n");
+}
+
+INTERCEPTOR(int, mlock, const void *addr, uptr len) {
+ MlockIsUnsupported();
+ return 0;
+}
+
+INTERCEPTOR(int, munlock, const void *addr, uptr len) {
+ MlockIsUnsupported();
+ return 0;
+}
+
+INTERCEPTOR(int, mlockall, int flags) {
+ MlockIsUnsupported();
+ return 0;
+}
+
+INTERCEPTOR(int, munlockall, void) {
+ MlockIsUnsupported();
+ return 0;
+}
struct MSanInterceptorContext {
bool in_interceptor_scope;
diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc
index 2269bb23749..ab109874bc2 100644
--- a/compiler-rt/lib/msan/tests/msan_test.cc
+++ b/compiler-rt/lib/msan/tests/msan_test.cc
@@ -3496,3 +3496,10 @@ TEST(MemorySanitizerAllocator, get_allocated_size_and_ownership) {
delete int_ptr;
}
+
+TEST(MemorySanitizer, MlockTest) {
+ EXPECT_EQ(0, mlockall(MCL_CURRENT));
+ EXPECT_EQ(0, mlock((void*)0x12345, 0x5678));
+ EXPECT_EQ(0, munlockall());
+ EXPECT_EQ(0, munlock((void*)0x987, 0x654));
+}
OpenPOWER on IntegriCloud