[compiler-rt] r320594 - [sanitizer] Introduce a vDSO aware timing function

Kostya Kortchinsky via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 16 12:56:03 PST 2017


Sent out https://reviews.llvm.org/D41325 for review.
That *should* fix it, but I have no way to test it. Please let me know.
I am not sure if you can add yourself as a reviewer, if so, please do.


On Sat, Dec 16, 2017 at 9:51 AM, Krzysztof Parzyszek <
kparzysz at codeaurora.org> wrote:

> This broke FreeBSD build:
>
> In file included from /w/src/llvm.org/projects/compi
> ler-rt/lib/lsan/lsan_common.cc:15:
> In file included from /w/src/llvm.org/projects/compi
> ler-rt/lib/lsan/lsan_common.h:18:
> In file included from /w/src/llvm.org/projects/compi
> ler-rt/lib/lsan/../sanitizer_common/sanitizer_allocator.h:23:
> In file included from /w/src/llvm.org/projects/compi
> ler-rt/lib/lsan/../sanitizer_common/sanitizer_procmaps.h:23:
> /w/src/llvm.org/projects/compiler-rt/lib/lsan/../sanitizer_
> common/sanitizer_linux.h:49:29: error: unknown type name
> '__sanitizer_clockid_t'; did you mean '__sanitizer_clock_t'?
> uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
>                             ^~~~~~~~~~~~~~~~~~~~~
>                             __sanitizer_clock_t
> /w/src/llvm.org/projects/compiler-rt/lib/lsan/../sanitizer_
> common/sanitizer_platform_limits_posix.h:530:15: note:
> '__sanitizer_clock_t' declared here
>   typedef int __sanitizer_clock_t;
>               ^
>
> -Krzysztof
>
>
>
> On 12/13/2017 10:23 AM, Kostya Kortchinsky via llvm-commits wrote:
>
>> Author: cryptoad
>> Date: Wed Dec 13 08:23:54 2017
>> New Revision: 320594
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=320594&view=rev
>> Log:
>> [sanitizer] Introduce a vDSO aware timing function
>>
>> Summary:
>> See D40657 & D40679 for previous versions of this patch & description.
>>
>> A couple of things were fixed here to have it not break some bots.
>> Weak symbols can't be used with `SANITIZER_GO` so the previous version was
>> breakin TsanGo. I set up some additional local tests and those pass now.
>>
>> I changed the workaround for the glibc vDSO issue: `__progname` is
>> initialized
>> after the vDSO and is actually public and of known type, unlike
>> `__vdso_clock_gettime`. This works better, and with all compilers.
>>
>> The rest is the same.
>>
>> Reviewers: alekseyshl
>>
>> Reviewed By: alekseyshl
>>
>> Subscribers: srhines, kubamracek, krytarowski, llvm-commits, #sanitizers
>>
>> Differential Revision: https://reviews.llvm.org/D41121
>>
>> Modified:
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_
>> primary64.h
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_
>> interceptors.inc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_fuchsia.cc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_generic.inc
>>      compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
>>      compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
>>      compiler-rt/trunk/lib/scudo/scudo_tsd.h
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_
>> primary64.h
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_allocator_primary64.h?rev=320594&
>> r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_primary64.h
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_primary64.h
>> Wed Dec 13 08:23:54 2017
>> @@ -697,7 +697,7 @@ class SizeClassAllocator64 {
>>           // Do it only when the feature is turned on, to avoid a
>> potentially
>>           // extraneous syscall.
>>           if (ReleaseToOSIntervalMs() >= 0)
>> -          region->rtoi.last_release_at_ns = NanoTime();
>> +          region->rtoi.last_release_at_ns = MonotonicNanoTime();
>>         }
>>         // Do the mmap for the user memory.
>>         const uptr user_map_size =
>> @@ -827,7 +827,7 @@ class SizeClassAllocator64 {
>>           return;
>>           if (region->rtoi.last_release_at_ns + interval_ms * 1000000ULL
>> >
>> -          NanoTime()) {
>> +          MonotonicNanoTime()) {
>>           return;  // Memory was returned recently.
>>         }
>>       }
>> @@ -844,6 +844,6 @@ class SizeClassAllocator64 {
>>         region->rtoi.num_releases += memory_mapper.GetReleasedRange
>> sCount();
>>         region->rtoi.last_released_bytes = memory_mapper.GetReleasedBytes
>> ();
>>       }
>> -    region->rtoi.last_release_at_ns = NanoTime();
>> +    region->rtoi.last_release_at_ns = MonotonicNanoTime();
>>     }
>>   };
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_common.h?rev=320594&r1=320593&r2=
>> 320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Wed Dec 13
>> 08:23:54 2017
>> @@ -295,6 +295,7 @@ uptr GetTlsSize();
>>   void SleepForSeconds(int seconds);
>>   void SleepForMillis(int millis);
>>   u64 NanoTime();
>> +u64 MonotonicNanoTime();
>>   int Atexit(void (*function)(void));
>>   void SortArray(uptr *array, uptr size);
>>   void SortArray(u32 *array, uptr size);
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_
>> interceptors.inc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_common_interceptors.inc?rev=320594&
>> r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>> Wed Dec 13 08:23:54 2017
>> @@ -2045,6 +2045,13 @@ INTERCEPTOR(int, clock_gettime, u32 clk_
>>     }
>>     return res;
>>   }
>> +namespace __sanitizer {
>> +extern "C" {
>> +int real_clock_gettime(u32 clk_id, void *tp) {
>> +  return REAL(clock_gettime)(clk_id, tp);
>> +}
>> +}  // extern "C"
>> +}  // namespace __sanitizer
>>   INTERCEPTOR(int, clock_settime, u32 clk_id, const void *tp) {
>>     void *ctx;
>>     COMMON_INTERCEPTOR_ENTER(ctx, clock_settime, clk_id, tp);
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_fuchsia.cc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_fuchsia.cc?rev=320594&r1=320593&r2=
>> 320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_fuchsia.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_fuchsia.cc Wed Dec
>> 13 08:23:54 2017
>> @@ -51,6 +51,8 @@ unsigned int internal_sleep(unsigned int
>>     u64 NanoTime() { return _zx_time_get(ZX_CLOCK_UTC); }
>>   +u64 MonotonicNanoTime() { return _zx_time_get(ZX_CLOCK_MONOTONIC); }
>> +
>>   uptr internal_getpid() {
>>     zx_info_handle_basic_t info;
>>     zx_status_t status =
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_linux.cc?rev=320594&r1=320593&r2=
>> 320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Wed Dec 13
>> 08:23:54 2017
>> @@ -459,6 +459,10 @@ u64 NanoTime() {
>>     return (u64)tv.tv_sec * 1000*1000*1000 + tv.tv_usec * 1000;
>>   }
>>   +uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
>> +  return internal_syscall_ptr(SYSCALL(clock_gettime), clk_id, tp);
>> +}
>> +
>>   // Like getenv, but reads env directly from /proc (on Linux) or parses
>> the
>>   // 'environ' array (on FreeBSD) and does not use libc. This function
>> should be
>>   // called first inside __asan_init.
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_linux.h?rev=320594&r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Wed Dec 13
>> 08:23:54 2017
>> @@ -46,6 +46,7 @@ uptr internal_getdents(fd_t fd, struct l
>>   uptr internal_sigaltstack(const void* ss, void* oss);
>>   uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
>>       __sanitizer_sigset_t *oldset);
>> +uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
>>     // Linux-only syscalls.
>>   #if SANITIZER_LINUX
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_
>> libcdep.cc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_linux_libcdep.cc?rev=320594&r1=
>> 320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>> Wed Dec 13 08:23:54 2017
>> @@ -707,6 +707,47 @@ void LogMessageOnPrintf(const char *str)
>>     #endif  // SANITIZER_LINUX
>>   +#if SANITIZER_LINUX && !SANITIZER_GO
>> +// glibc crashes when using clock_gettime from a preinit_array function
>> as the
>> +// vDSO function pointers haven't been initialized yet. __progname is
>> +// initialized after the vDSO function pointers, so if it exists, is not
>> null
>> +// and is not empty, we can use clock_gettime.
>> +extern "C" SANITIZER_WEAK_ATTRIBUTE char *__progname;
>> +INLINE bool CanUseVDSO() {
>> +  // Bionic is safe, it checks for the vDSO function pointers to be
>> initialized.
>> +  if (SANITIZER_ANDROID)
>> +    return true;
>> +  if (&__progname && __progname && *__progname)
>> +    return true;
>> +  return false;
>> +}
>> +
>> +// MonotonicNanoTime is a timing function that can leverage the vDSO by
>> calling
>> +// clock_gettime. real_clock_gettime only exists if clock_gettime is
>> +// intercepted, so define it weakly and use it if available.
>> +extern "C" SANITIZER_WEAK_ATTRIBUTE
>> +int real_clock_gettime(u32 clk_id, void *tp);
>> +u64 MonotonicNanoTime() {
>> +  timespec ts;
>> +  if (CanUseVDSO()) {
>> +    if (&real_clock_gettime)
>> +      real_clock_gettime(CLOCK_MONOTONIC, &ts);
>> +    else
>> +      clock_gettime(CLOCK_MONOTONIC, &ts);
>> +  } else {
>> +    internal_clock_gettime(CLOCK_MONOTONIC, &ts);
>> +  }
>> +  return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
>> +}
>> +#else
>> +// Non-Linux & Go always use the syscall.
>> +u64 MonotonicNanoTime() {
>> +  timespec ts;
>> +  internal_clock_gettime(CLOCK_MONOTONIC, &ts);
>> +  return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
>> +}
>> +#endif  // SANITIZER_LINUX && !SANITIZER_GO
>> +
>>   } // namespace __sanitizer
>>   -#endif // SANITIZER_FREEBSD || SANITIZER_LINUX
>> +#endif  // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_mac.cc?rev=320594&r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Wed Dec 13
>> 08:23:54 2017
>> @@ -365,6 +365,10 @@ u64 NanoTime() {
>>     return 0;
>>   }
>>   +u64 MonotonicNanoTime() {
>> +  return 0;
>> +}
>> +
>>   uptr GetTlsSize() {
>>     return 0;
>>   }
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_
>> generic.inc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_syscall_generic.inc?rev=320594&r1=
>> 320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_generic.inc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_generic.inc
>> Wed Dec 13 08:23:54 2017
>> @@ -36,6 +36,7 @@
>>   # define SYS_sigaltstack SYS___sigaltstack14
>>   # define SYS_sigprocmask SYS___sigprocmask14
>>   # define SYS_nanosleep SYS___nanosleep50
>> +# define SYS_clock_gettime SYS___clock_gettime50
>>   # if SANITIZER_WORDSIZE == 64
>>   #  define internal_syscall_ptr  __syscall
>>   # else
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sa
>> nitizer_common/sanitizer_win.cc?rev=320594&r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Wed Dec 13
>> 08:23:54 2017
>> @@ -505,6 +505,10 @@ u64 NanoTime() {
>>     return 0;
>>   }
>>   +u64 MonotonicNanoTime() {
>> +  return 0;
>> +}
>> +
>>   void Abort() {
>>     internal__exit(3);
>>   }
>>
>> Modified: compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sc
>> udo/scudo_allocator.cpp?rev=320594&r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/scudo/scudo_allocator.cpp (original)
>> +++ compiler-rt/trunk/lib/scudo/scudo_allocator.cpp Wed Dec 13 08:23:54
>> 2017
>> @@ -301,7 +301,7 @@ struct ScudoAllocator {
>>         CheckRssLimit = HardRssLimitMb || SoftRssLimitMb;
>>       if (CheckRssLimit)
>> -      atomic_store_relaxed(&RssLastCheckedAtNS, NanoTime());
>> +      atomic_store_relaxed(&RssLastCheckedAtNS, MonotonicNanoTime());
>>     }
>>       // Helper function that checks for a valid Scudo chunk. nullptr
>> isn't.
>> @@ -319,7 +319,7 @@ struct ScudoAllocator {
>>     // it can, every 100ms, otherwise it will just return the current one.
>>     bool isRssLimitExceeded() {
>>       u64 LastCheck = atomic_load_relaxed(&RssLastCheckedAtNS);
>> -    const u64 CurrentCheck = NanoTime();
>> +    const u64 CurrentCheck = MonotonicNanoTime();
>>       if (LIKELY(CurrentCheck < LastCheck + (100ULL * 1000000ULL)))
>>         return atomic_load_relaxed(&RssLimitExceeded);
>>       if (!atomic_compare_exchange_weak(&RssLastCheckedAtNS, &LastCheck,
>>
>> Modified: compiler-rt/trunk/lib/scudo/scudo_tsd.h
>> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sc
>> udo/scudo_tsd.h?rev=320594&r1=320593&r2=320594&view=diff
>> ============================================================
>> ==================
>> --- compiler-rt/trunk/lib/scudo/scudo_tsd.h (original)
>> +++ compiler-rt/trunk/lib/scudo/scudo_tsd.h Wed Dec 13 08:23:54 2017
>> @@ -36,7 +36,7 @@ struct ALIGNED(64) ScudoTSD {
>>         return true;
>>       }
>>       if (atomic_load_relaxed(&Precedence) == 0)
>> -      atomic_store_relaxed(&Precedence, NanoTime());
>> +      atomic_store_relaxed(&Precedence, MonotonicNanoTime());
>>       return false;
>>     }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
>> ---
>> This email has been checked for viruses by AVG.
>> http://www.avg.com
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171216/fb337094/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4845 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171216/fb337094/attachment.bin>


More information about the llvm-commits mailing list