• [PATCH 1/5] x86/kernel: Add option that TSC on Socket 0 being non-zero

    From mike.travis@hpe.com@21:1/5 to All on Mon Oct 2 22:50:16 2017
    Add a flag to indicate and process that TSC counters are on chassis
    that reset at different times during system startup. Therefore which
    TSC ADJUST values should be zero is not predictable.

    Signed-off-by: Mike Travis <mike.travis@hpe.com>
    Reviewed-by: Dimitri Sivanich <dimitri.sivanich@hpe.com>
    Reviewed-by: Russ Anderson <russ.anderson@hpe.com>
    Reviewed-by: And ew Banman <andrew.abanman@hpe.com>
    Reviewed-by: Peter Zijlstra <peterz@infradead.org>
    ---
    arch/x86/include/asm/tsc.h | 1 +
    arch/x86/kernel/tsc_sync.c | 39 +++++++++++++++++++++++++++++++++++----
    2 files changed, 36 insertions(+), 4 deletions(-)

    --- linux.orig/arch/x86/include/asm/tsc.h
    +++ linux/arch/x86/include/asm/tsc.h
    @@ -35,6 +35,7 @@ extern void tsc_init(void);
    extern void mark_tsc_unstable(char *reason);
    extern int unsynchronized_tsc(void);
    extern int check_tsc_unstable(void);
    +extern void mark_tsc_multi_sync_resets(char *reason);
    extern unsigned long native_calibrate_cpu(void);
    extern unsigned long native_calibrate_tsc(void);
    extern unsigned long long native_sched_clock_from_tsc(u64 tsc);
    --- linux.orig/arch/x86/kernel/tsc_sync.c
    +++ linux/arch/x86/kernel/tsc_sync.c
    @@ -30,6 +30,20 @@ struct tsc_adjust {

    static DEFINE_PER_CPU(struct tsc_adjust, tsc_adjust);

    +/*
    + * TSC's on different sockets may be reset asynchronously.
    + * This may cause the TSC ADJUST value on socket 0 to be NOT 0.
    + */
    +static bool __read_mostly tsc_multi_sync_resets;
    +
    +