[compiler-rt] r193755 - [msan] Disable mlock/mlockall to work around a linux kernel bug.

Dmitry Vyukov dvyukov at google.com
Thu Oct 31 09:01:48 PDT 2013


On Thu, Oct 31, 2013 at 7:51 PM, Evgeniy Stepanov
<eugeni.stepanov at gmail.com> wrote:
> Author: eugenis
> Date: Thu Oct 31 10:51:22 2013
> New Revision: 193755
>
> URL: http://llvm.org/viewvc/llvm-project?rev=193755&view=rev
> Log:
> [msan] Disable mlock/mlockall to work around a linux kernel bug.
>
> The same logic is present in ASan and TSan.
>
> Modified:
>     compiler-rt/trunk/lib/msan/msan_interceptors.cc
>     compiler-rt/trunk/lib/msan/tests/msan_test.cc
>
> Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=193755&r1=193754&r2=193755&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
> +++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Thu Oct 31 10:51:22 2013
> @@ -1172,6 +1172,35 @@ INTERCEPTOR(void *, shmat, int shmid, co
>    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) {

Probably we should move this in sanitizer_common


> +  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;
>
> Modified: compiler-rt/trunk/lib/msan/tests/msan_test.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/tests/msan_test.cc?rev=193755&r1=193754&r2=193755&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/tests/msan_test.cc (original)
> +++ compiler-rt/trunk/lib/msan/tests/msan_test.cc Thu Oct 31 10:51:22 2013
> @@ -3496,3 +3496,10 @@ TEST(MemorySanitizerAllocator, get_alloc
>
>    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));
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list