• David Hildenbrand's avatar
    s390/time: simplify stp time syncs · 41ad0220
    David Hildenbrand authored
    The way we call do_adjtimex() today is broken. It has 0 effect, as
    ADJ_OFFSET_SINGLESHOT (0x0001) in the kernel maps to !ADJ_ADJTIME
    (in contrast to user space where it maps to  ADJ_OFFSET_SINGLESHOT |
    ADJ_ADJTIME - 0x8001). !ADJ_ADJTIME will silently ignore all adjustments
    without STA_PLL being active. We could switch to ADJ_ADJTIME or turn
    STA_PLL on, but still we would run into some problems:
    
    - Even when switching to nanoseconds, we lose accuracy.
    - Successive calls to do_adjtimex() will simply overwrite any leftovers
      from the previous call (if not fully handled)
    - Anything that NTP does using the sysctl heavily interferes with our
      use.
    - !ADJ_ADJTIME will silently round stuff > or < than 0.5 seconds
    
    Reusing do_adjtimex() here just feels wrong. The whole STP synchronization
    works right now *somehow* only, as do_adjtimex() does nothing and our
    TOD clock jumps in time, although it shouldn't. This is especially bad
    as the clock could jump backwards in time. We will have to find another
    way to fix this up.
    
    As leap seconds are also not properly handled yet, let's just get rid of
    all this complex logic altogether and use the correct clock_delta for
    fixing up the clock comparator and keeping the sched_clock monotonic.
    
    This change should have 0 effect on the current STP mechanism. Once we
    know how to best handle sync events and leap second updates, we'll start
    with a fresh implementation.
    Signed-off-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    41ad0220
time.c 20.1 KB