summaryrefslogtreecommitdiffstats
path: root/src/vppinfra/time.c
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2020-02-04 16:10:17 -0500
committerDamjan Marion <dmarion@me.com>2020-02-05 09:20:48 +0000
commit51cabf2a1486e8b4aa6756184d6e2ba0efc78b8a (patch)
tree20a8a0e24f84121a4e24e46a0a727e08e1caa5c4 /src/vppinfra/time.c
parenta80f8f371733a73a0fa8351a66bd1e519f1b90cd (diff)
vppinfra: deal with 0 return from os_cpu_clock_frequency()
Sporadic reports of os_cpu_clock_frequency() returning 0.0 in highly parallel container environments. To avoid immediate division by zero: Step 1: try estimate_clock_frequency(1e-3). Step 2: give up. Pretend we have a 2gHz clock. Type: fix Signed-off-by: Dave Barach <dave@barachs.net> Change-Id: I19d0fe5259b757ab778599c7026ce485153b43fa
Diffstat (limited to 'src/vppinfra/time.c')
-rw-r--r--src/vppinfra/time.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/vppinfra/time.c b/src/vppinfra/time.c
index 3b3acfa3d1b..27758dc7534 100644
--- a/src/vppinfra/time.c
+++ b/src/vppinfra/time.c
@@ -208,6 +208,22 @@ clib_time_init (clib_time_t * c)
{
clib_memset (c, 0, sizeof (c[0]));
c->clocks_per_second = os_cpu_clock_frequency ();
+ /*
+ * Sporadic reports of os_cpu_clock_frequency() returning 0.0
+ * in highly parallel container environments.
+ * To avoid immediate division by zero:
+ * Step 1: try estimate_clock_frequency().
+ * Step 2: give up. Pretend we have a 2gHz clock.
+ */
+ if (PREDICT_FALSE (c->clocks_per_second == 0.0))
+ {
+ c->clocks_per_second = estimate_clock_frequency (1e-3);
+ if (c->clocks_per_second == 0.0)
+ {
+ clib_warning ("os_cpu_clock_frequency() returned 0.0, use 2e9...");
+ c->clocks_per_second = 2e9;
+ }
+ }
c->seconds_per_clock = 1 / c->clocks_per_second;
c->log2_clocks_per_second = min_log2_u64 ((u64) c->clocks_per_second);