diff --git a/sys_linux.c b/sys_linux.c index 081a036..11cf6a4 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -566,6 +566,7 @@ static double set_frequency(double freq_ppm) { long required_tick; + long min_allowed_tick, max_allowed_tick; double required_freq; /* what we use */ double scaled_freq; /* what adjtimex & the kernel use */ double old_total_tick; @@ -594,6 +595,18 @@ set_frequency(double freq_ppm) scaled_freq = -freq_scale * required_freq; } + min_allowed_tick = nominal_tick - max_tick_bias + 5; + max_allowed_tick = nominal_tick + max_tick_bias - 5; + + if (required_tick < min_allowed_tick || required_tick > max_allowed_tick) { + LOG(LOGS_WARN, LOGF_SysLinux, "Required tick %ld outside allowed range (%ld .. %ld)", required_tick, min_allowed_tick, max_allowed_tick); + if (required_tick < min_allowed_tick) { + required_tick = min_allowed_tick; + } else { + required_tick = max_allowed_tick; + } + } + current_tick = required_tick; old_total_tick = current_total_tick; current_total_tick = ((double)current_tick + required_freq/dhz) / 1.0e6 ;