On Mon, Mar 31 2025 at 16:53, Miroslav Lichvar wrote:
> On Thu, Mar 27, 2025 at 04:42:49PM +0100, Miroslav Lichvar wrote:
>> Maybe I could simply patch the kernel to force a small clock
>> multiplier to increase the rate at which the error accumulates.
>
> I tried that and it indeed makes the issue clearly visible. The COARSE
> fix makes the clock less stable. It's barely visible with the normal
> multiplier, at least for the clocksource I tested, but a reduced
> multiplier forces a larger NTP error and raises it above the precision
> and instability of the system and reference clocks.
>
> The test was done on a machine with a TSC clocksource (3GHz CPU with
> disabled frequency scaling - normal multplier is 5592407) and tried a
> multiplier reduced by 4, 16, 64 with this COARSE-fixing patch not
> applied and applied. Each test ran for 1 minute and produced an
> average value of skew - stability of the clock frequency as reported
> by chronyd in the tracking log when synchronizing to a free-running
> PTP clock at 64, 16, and 4 updates per second. It's in parts per
> million (resolution in the chrony log is limited to 0.001 ppm).
>
> Mult reduction        Updates/sec     Skew before     Skew after
> 1             4               0.000           0.000
> 1             16              0.001           0.002
> 1             64              0.002           0.006
> 4             4               0.001           0.001
> 4             16              0.003           0.005
> 4             64              0.005           0.015
> 16            4               0.004           0.009
> 16            16              0.011           0.069
> 16            64              0.020           0.117
> 64            4               0.013           0.012
> 64            16              0.030           0.107
> 64            64              0.058           0.879

Hrm.

Can you try the delta patch below?

Thanks,

        tglx
---
 kernel/time/timekeeping.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -2234,8 +2234,8 @@ static bool timekeeping_advance(enum tim
                                   tk->tkr_mono.cycle_last, tk->tkr_mono.mask,
                                   tk->tkr_mono.clock->max_raw_delta);
 
-       /* Check if there's really nothing to do */
-       if (offset < real_tk->cycle_interval && mode == TK_ADV_TICK)
+       /* Check if there's really something to do */
+       if (offset < real_tk->cycle_interval)
                return false;
 
        offset = timekeeping_accumulate(tk, offset, mode, &clock_set);

Reply via email to