• I
    x86: Introduce x86_cpuinit.early_percpu_clock_init hook · df156f90
    Igor Mammedov 提交于
    When kvm guest uses kvmclock, it may hang on vcpu hot-plug.
    This is caused by an overflow in pvclock_get_nsec_offset,
    
        u64 delta = tsc - shadow->tsc_timestamp;
    
    which in turn is caused by an undefined values from percpu
    hv_clock that hasn't been initialized yet.
    Uninitialized clock on being booted cpu is accessed from
       start_secondary
        -> smp_callin
          ->  smp_store_cpu_info
            -> identify_secondary_cpu
              -> mtrr_ap_init
                -> mtrr_restore
                  -> stop_machine_from_inactive_cpu
                    -> queue_stop_cpus_work
                      ...
                        -> sched_clock
                          -> kvm_clock_read
    which is well before x86_cpuinit.setup_percpu_clockev call in
    start_secondary, where percpu clock is initialized.
    
    This patch introduces a hook that allows to setup/initialize
    per_cpu clock early and avoid overflow due to reading
      - undefined values
      - old values if cpu was offlined and then onlined again
    
    Another possible early user of this clock source is ftrace that
    accesses it to get timestamps for ring buffer entries. So if
    mtrr_ap_init is moved from identify_secondary_cpu to past
    x86_cpuinit.setup_percpu_clockev in start_secondary, ftrace
    may cause the same overflow/hang on cpu hot-plug anyway.
    
    More complete description of the problem:
      https://lkml.org/lkml/2012/2/2/101
    
    Credits to Marcelo Tosatti <mtosatti@redhat.com> for hook idea.
    Acked-by: NThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
    Signed-off-by: NMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: NAvi Kivity <avi@redhat.com>
    df156f90
x86_init.h 5.7 KB