[Openmp-commits] [PATCH] D55300: Fix transient divide by zero bug in 32-bit code
Jonathan Peyton via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Tue Dec 4 15:38:34 PST 2018
jlpeyton created this revision.
jlpeyton added reviewers: AndreyChurbanov, tlwilmar, hbae.
jlpeyton added a project: OpenMP.
The value returned by `__kmp_now_nsec()` can overflow 32-bit values causing incorrect values to be returned. The overflow can end up causing a divide by zero error because in `__kmp_initialize_system_tick()`, the value (`__kmp_now_nsec() - nsec`) can end up being much larger than the numerator:
`1e6 * (delay + (now - goal))`
during a pathological timing where the current time calculated is much larger than `nsec`. When this happens, the value of `__kmp_ticks_per_msec` is set to zero which is then used as the denominator in the `KMP_NOW_MSEC()` macro leading to the divide by zero error.
Repository:
rOMP OpenMP
https://reviews.llvm.org/D55300
Files:
runtime/src/z_Linux_util.cpp
Index: runtime/src/z_Linux_util.cpp
===================================================================
--- runtime/src/z_Linux_util.cpp
+++ runtime/src/z_Linux_util.cpp
@@ -1927,20 +1927,27 @@
kmp_uint64 __kmp_now_nsec() {
struct timeval t;
gettimeofday(&t, NULL);
- return KMP_NSEC_PER_SEC * t.tv_sec + 1000 * t.tv_usec;
+ kmp_uint64 nsec = (kmp_uint64)KMP_NSEC_PER_SEC * (kmp_uint64)t.tv_sec +
+ (kmp_uint64)1000 * (kmp_uint64)t.tv_usec;
+ return nsec;
}
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
/* Measure clock ticks per millisecond */
void __kmp_initialize_system_tick() {
+ kmp_uint64 now, nsec2, diff;
kmp_uint64 delay = 100000; // 50~100 usec on most machines.
kmp_uint64 nsec = __kmp_now_nsec();
kmp_uint64 goal = __kmp_hardware_timestamp() + delay;
- kmp_uint64 now;
while ((now = __kmp_hardware_timestamp()) < goal)
;
- __kmp_ticks_per_msec =
- (kmp_uint64)(1e6 * (delay + (now - goal)) / (__kmp_now_nsec() - nsec));
+ nsec2 = __kmp_now_nsec();
+ diff = nsec2 - nsec;
+ if (diff > 0) {
+ kmp_uint64 tpms = (kmp_uint64)(1e6 * (delay + (now - goal)) / diff);
+ if (tpms > 0)
+ __kmp_ticks_per_msec = tpms;
+ }
}
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55300.176723.patch
Type: text/x-patch
Size: 1203 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20181204/035cfe6e/attachment.bin>
More information about the Openmp-commits
mailing list