[compiler-rt] r204150 - tsan: deadlock detector: add deadlock detector flags

Dmitry Vyukov dvyukov at google.com
Wed Mar 19 08:08:02 PDT 2014


On Wed, Mar 19, 2014 at 12:16 PM, Kostya Serebryany <kcc at google.com> wrote:
> the new flag (second_deadlock_stack) has to be in common flags because
> eventually we want the deadlock detector bundled with other sanitizers (at
> least, asan).

then we will derive CommonFlags from DDFlags



> Also, i'd make it an int rather than bool, so that we can set the maximal
> length of the collected stack trace.
> Then also add lit tests for this flag, please.

done in r204240

> Finally, please update docs at
> https://code.google.com/p/thread-sanitizer/wiki/DeadlockDetector

done


>
>
> On Tue, Mar 18, 2014 at 5:13 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
>>
>> Author: dvyukov
>> Date: Tue Mar 18 08:13:47 2014
>> New Revision: 204150
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=204150&view=rev
>> Log:
>> tsan: deadlock detector: add deadlock detector flags
>> the first flags is to enable printing of the second stack per edge
>>
>>
>> Modified:
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
>>
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
>>     compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
>>     compiler-rt/trunk/lib/tsan/dd/dd_rtl.h
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
>> Tue Mar 18 08:13:47 2014
>> @@ -56,7 +56,8 @@ struct DD : public DDetector {
>>    void MutexEnsureID(DDLogicalThread *lt, DDMutex *m);
>>  };
>>
>> -DDetector *DDetector::Create() {
>> +DDetector *DDetector::Create(const DDFlags *flags) {
>> +  (void)flags;
>>    void *mem = MmapOrDie(sizeof(DD), "deadlock detector");
>>    return new(mem) DD();
>>  }
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
>> Tue Mar 18 08:13:47 2014
>> @@ -82,7 +82,7 @@ struct Mutex {
>>  };
>>
>>  struct DD : public DDetector {
>> -  explicit DD();
>> +  explicit DD(const DDFlags *flags);
>>
>>    DDPhysicalThread* CreatePhysicalThread();
>>    void DestroyPhysicalThread(DDPhysicalThread *pt);
>> @@ -105,21 +105,24 @@ struct DD : public DDetector {
>>    Mutex *getMutex(u32 id);
>>    u32 getMutexId(Mutex *m);
>>
>> +  DDFlags flags;
>> +
>> +  Mutex* mutex[kL1Size];
>> +
>>    SpinMutex mtx;
>>    InternalMmapVector<u32> free_id;
>> -
>>    int id_gen;
>> -
>> -  Mutex* mutex[kL1Size];
>>  };
>>
>> -DDetector *DDetector::Create() {
>> +DDetector *DDetector::Create(const DDFlags *flags) {
>> +  (void)flags;
>>    void *mem = MmapOrDie(sizeof(DD), "deadlock detector");
>> -  return new(mem) DD();
>> +  return new(mem) DD(flags);
>>  }
>>
>> -DD::DD()
>> -    : free_id(1024) {
>> +DD::DD(const DDFlags *flags)
>> +    : flags(*flags)
>> +    , free_id(1024) {
>>    id_gen = 0;
>>  }
>>
>> @@ -210,7 +213,8 @@ void DD::MutexBeforeLock(DDCallback *cb,
>>
>>    ThreadMutex *tm = &lt->locked[lt->nlocked++];
>>    tm->id = m->id;
>> -  tm->stk = cb->Unwind();
>> +  if (flags.second_deadlock_stack)
>> +    tm->stk = cb->Unwind();
>>    if (lt->nlocked == 1) {
>>      VPrintf(3, "#%llu: DD::MutexBeforeLock first mutex\n",
>>          cb->lt->ctx);
>> @@ -296,7 +300,8 @@ void DD::MutexAfterLock(DDCallback *cb,
>>      m->id = allocateId(cb);
>>    ThreadMutex *tm = &lt->locked[lt->nlocked++];
>>    tm->id = m->id;
>> -  tm->stk = cb->Unwind();
>> +  if (flags.second_deadlock_stack)
>> +    tm->stk = cb->Unwind();
>>  }
>>
>>  void DD::MutexBeforeUnlock(DDCallback *cb, DDMutex *m, bool wlock) {
>> @@ -407,7 +412,7 @@ void DD::Report(DDPhysicalThread *pt, DD
>>      rep->loop[i].thr_ctx = link->tid;
>>      rep->loop[i].mtx_ctx0 = link0->id;
>>      rep->loop[i].mtx_ctx1 = link->id;
>> -    rep->loop[i].stk[0] = link->stk0;
>> +    rep->loop[i].stk[0] = flags.second_deadlock_stack ? link->stk0 : 0;
>>      rep->loop[i].stk[1] = link->stk1;
>>    }
>>    pt->report_pending = true;
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
>> Tue Mar 18 08:13:47 2014
>> @@ -46,6 +46,10 @@ struct DDMutex {
>>    u64  ctx;
>>  };
>>
>> +struct DDFlags {
>> +  bool second_deadlock_stack;
>> +};
>> +
>>  struct DDReport {
>>    enum { kMaxLoopSize = 8 };
>>    int n;  // number of entries in loop
>> @@ -65,7 +69,7 @@ struct DDCallback {
>>  };
>>
>>  struct DDetector {
>> -  static DDetector *Create();
>> +  static DDetector *Create(const DDFlags *flags);
>>
>>    virtual DDPhysicalThread* CreatePhysicalThread() { return 0; }
>>    virtual void DestroyPhysicalThread(DDPhysicalThread *pt) {}
>>
>> Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc Tue Mar 18 08:13:47 2014
>> @@ -45,9 +45,11 @@ static void ReportDeadlock(Thread *thr,
>>      Printf("Thread %d locks mutex %llu while holding mutex %llu:\n",
>>        rep->loop[i].thr_ctx, rep->loop[i].mtx_ctx1,
>> rep->loop[i].mtx_ctx0);
>>      PrintStackTrace(thr, rep->loop[i].stk[1]);
>> -    Printf("Mutex %llu was acquired here:\n",
>> -      rep->loop[i].mtx_ctx0);
>> -    PrintStackTrace(thr, rep->loop[i].stk[0]);
>> +    if (rep->loop[i].stk[0]) {
>> +      Printf("Mutex %llu was acquired here:\n",
>> +        rep->loop[i].mtx_ctx0);
>> +      PrintStackTrace(thr, rep->loop[i].stk[0]);
>> +    }
>>    }
>>    Printf("==============================\n");
>>    Die();
>> @@ -63,15 +65,32 @@ u32 Callback::Unwind() {
>>    return CurrentStackTrace(thr, 3);
>>  }
>>
>> +void InitializeFlags(Flags *f, const char *env) {
>> +  internal_memset(f, 0, sizeof(*f));
>> +
>> +  // Default values.
>> +  f->second_deadlock_stack = false;
>> +
>> +  SetCommonFlagsDefaults(f);
>> +  // Override some common flags defaults.
>> +  f->allow_addr2line = true;
>> +
>> +  // Override from command line.
>> +  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
>> +  ParseCommonFlagsFromString(f, env);
>> +
>> +  // Copy back to common flags.
>> +  *common_flags() = *f;
>> +}
>> +
>>  void Initialize() {
>>    static u64 ctx_mem[sizeof(Context) / sizeof(u64) + 1];
>>    ctx = new(ctx_mem) Context();
>>
>>    InitializeInterceptors();
>> -  ParseCommonFlagsFromString(flags(), GetEnv("DSAN_OPTIONS"));
>> -  //common_flags()->allow_addr2line = true;
>> +  InitializeFlags(flags(), GetEnv("DSAN_OPTIONS"));
>>    common_flags()->symbolize = true;
>> -  ctx->dd = DDetector::Create();
>> +  ctx->dd = DDetector::Create(flags());
>>  }
>>
>>  void ThreadInit(Thread *thr) {
>>
>> Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.h?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/dd/dd_rtl.h (original)
>> +++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.h Tue Mar 18 08:13:47 2014
>> @@ -18,6 +18,9 @@
>>
>>  namespace __dsan {
>>
>> +struct Flags : CommonFlags, DDFlags {
>> +};
>> +
>>  struct Mutex {
>>    DDMutex dd;
>>  };
>> @@ -44,8 +47,9 @@ struct Context {
>>    MutexHashMap mutex_map;
>>  };
>>
>> -inline CommonFlags* flags() {
>> -  return common_flags();
>> +inline Flags* flags() {
>> +  static Flags flags;
>> +  return &flags;
>>  }
>>
>>  void Initialize();
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Tue Mar 18 08:13:47 2014
>> @@ -59,6 +59,9 @@ static void ParseFlags(Flags *f, const c
>>    ParseFlag(env, &f->history_size, "history_size");
>>    ParseFlag(env, &f->io_sync, "io_sync");
>>    ParseFlag(env, &f->die_after_fork, "die_after_fork");
>> +
>> +  // DDFlags
>> +  ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
>>  }
>>
>>  void InitializeFlags(Flags *f, const char *env) {
>> @@ -91,6 +94,9 @@ void InitializeFlags(Flags *f, const cha
>>    f->io_sync = 1;
>>    f->die_after_fork = true;
>>
>> +  // DDFlags
>> +  f->second_deadlock_stack = false;
>> +
>>    SetCommonFlagsDefaults(f);
>>    // Override some common flags defaults.
>>    f->allow_addr2line = true;
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h Tue Mar 18 08:13:47 2014
>> @@ -15,10 +15,11 @@
>>  #define TSAN_FLAGS_H
>>
>>  #include "sanitizer_common/sanitizer_flags.h"
>> +#include "sanitizer_common/sanitizer_deadlock_detector_interface.h"
>>
>>  namespace __tsan {
>>
>> -struct Flags : CommonFlags {
>> +struct Flags : CommonFlags, DDFlags {
>>    // Enable dynamic annotations, otherwise they are no-ops.
>>    bool enable_annotations;
>>    // Supress a race report if we've already output another race report
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=204150&r1=204149&r2=204150&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Tue Mar 18 08:13:47 2014
>> @@ -251,7 +251,7 @@ void Initialize(ThreadState *thr) {
>>  #endif
>>    internal_start_thread(&BackgroundThread, 0);
>>    if (flags()->detect_deadlocks)
>> -    ctx->dd = DDetector::Create();
>> +    ctx->dd = DDetector::Create(flags());
>>
>>    if (ctx->flags.verbosity)
>>      Printf("***** Running under ThreadSanitizer v2 (pid %d) *****\n",
>>
>>
>> _______________________________________________
>> 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