diff options
author | Dave Barach <dave@barachs.net> | 2018-11-07 17:40:19 -0500 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-11-08 19:05:52 +0000 |
commit | ba603ba706a5942b7a44178940cd9a0383b93292 (patch) | |
tree | 208843808efa3f4820b0d9bba481330e8650b5d1 | |
parent | 5100aa9cb9e7acff35fa3bfde8aa95b5ace60344 (diff) |
Calculate clock rounding constant
Compute the first power of ten which is greater than 0.1% of the clock
rate. Save the result, and use it to round future results. The
previous constant value - 1e7 - didn't work properly on aarch64.
Change-Id: Ic021e3eb1b90c0d4a7d9f1b6425123f0c8b48b0b
Signed-off-by: Dave Barach <dave@barachs.net>
-rw-r--r-- | src/vppinfra/time.c | 21 | ||||
-rw-r--r-- | src/vppinfra/time.h | 2 |
2 files changed, 20 insertions, 3 deletions
diff --git a/src/vppinfra/time.c b/src/vppinfra/time.c index afb1a867ec7..2bba1daba12 100644 --- a/src/vppinfra/time.c +++ b/src/vppinfra/time.c @@ -198,7 +198,6 @@ clib_time_verify_frequency (clib_time_t * c) f64 dtr_max; u64 dtc = c->last_cpu_time - c->last_verify_cpu_time; f64 new_clocks_per_second, delta; - f64 round_units = 100e5; c->last_verify_cpu_time = c->last_cpu_time; c->last_verify_reference_time = now_reference; @@ -218,12 +217,27 @@ clib_time_verify_frequency (clib_time_t * c) return; } + if (PREDICT_FALSE (c->round_to_units == 0.0)) + { + f64 next_pow10, est_round_to_units; + /* + * Compute the first power of ten which is greater than + * 0.1% of the new clock rate. Save the result, and use it + * to round future results, so we don't end up calculating + * silly-looking clock rates. + */ + est_round_to_units = ((f64) dtc / dtr) * 0.001; + next_pow10 = ceil (log10 (est_round_to_units)); + c->round_to_units = pow (10.0, next_pow10); + } + /* * Reject large frequency changes, another consequence of * system clock changes particularly with old kernels. */ new_clocks_per_second = - flt_round_nearest ((f64) dtc / (dtr * round_units)) * round_units; + flt_round_nearest ((f64) dtc / (dtr * c->round_to_units)) + * c->round_to_units; delta = new_clocks_per_second - c->clocks_per_second; if (delta < 0.0) @@ -238,7 +252,8 @@ clib_time_verify_frequency (clib_time_t * c) } c->clocks_per_second = - flt_round_nearest ((f64) dtc / (dtr * round_units)) * round_units; + flt_round_nearest ((f64) dtc / (dtr * c->round_to_units)) + * c->round_to_units; c->seconds_per_clock = 1 / c->clocks_per_second; /* Double time between verifies; max at 64 secs ~ 1 minute. */ diff --git a/src/vppinfra/time.h b/src/vppinfra/time.h index 64370d523bb..0327ce0fd05 100644 --- a/src/vppinfra/time.h +++ b/src/vppinfra/time.h @@ -56,6 +56,8 @@ typedef struct from clock cycles into seconds. */ f64 seconds_per_clock; + f64 round_to_units; + /* Time stamp of call to clib_time_init call. */ u64 init_cpu_time; |