From: Dave Barach Date: Tue, 4 Feb 2020 21:10:17 +0000 (-0500) Subject: vppinfra: deal with 0 return from os_cpu_clock_frequency() X-Git-Tag: v20.09-rc0~661 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=51cabf2a1486e8b4aa6756184d6e2ba0efc78b8a 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 Change-Id: I19d0fe5259b757ab778599c7026ce485153b43fa --- 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);