• Arnd Bergmann's avatar
    pstore: Use ktime_get_real_fast_ns() instead of __getnstimeofday() · df27067e
    Arnd Bergmann authored
    __getnstimeofday() is a rather odd interface, with a number of quirks:
    
    - The caller may come from NMI context, but the implementation is not NMI safe,
      one way to get there from NMI is
    
          NMI handler:
            something bad
              panic()
                kmsg_dump()
                  pstore_dump()
                     pstore_record_init()
                       __getnstimeofday()
    
    - The calling conventions are different from any other timekeeping functions,
      to deal with returning an error code during suspended timekeeping.
    
    Address the above issues by using a completely different method to get the
    time: ktime_get_real_fast_ns() is NMI safe and has a reasonable behavior
    when timekeeping is suspended: it returns the time at which it got
    suspended. As Thomas Gleixner explained, this is safe, as
    ktime_get_real_fast_ns() does not call into the clocksource driver that
    might be suspended.
    
    The result can easily be transformed into a timespec structure. Since
    ktime_get_real_fast_ns() was not exported to modules, add the export.
    
    The pstore behavior for the suspended case changes slightly, as it now
    stores the timestamp at which timekeeping was suspended instead of storing
    a zero timestamp.
    
    This change is not addressing y2038-safety, that's subject to a more
    complex follow up patch.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarKees Cook <keescook@chromium.org>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Anton Vorontsov <anton@enomsg.org>
    Cc: Stephen Boyd <sboyd@codeaurora.org>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Colin Cross <ccross@android.com>
    Link: https://lkml.kernel.org/r/20171110152530.1926955-1-arnd@arndb.de
    df27067e
timekeeping.c 68.3 KB