From a7add488ae63fc2574dda97791cbc65fe67f7771 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Thu, 31 Oct 2013 15:51:22 +0000 Subject: [msan] Disable mlock/mlockall to work around a linux kernel bug. The same logic is present in ASan and TSan. llvm-svn: 193755 --- compiler-rt/lib/msan/msan_interceptors.cc | 29 +++++++++++++++++++++++++++++ compiler-rt/lib/msan/tests/msan_test.cc | 7 +++++++ 2 files changed, 36 insertions(+) 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)); +} -- cgit v1.2.3