Merge tag 'hyperv-next-signed-20210831' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / arch / x86 / kernel / cpu / mshyperv.c
index c890d67..e095c28 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/irq.h>
 #include <linux/kexec.h>
 #include <linux/i8253.h>
-#include <linux/panic_notifier.h>
 #include <linux/random.h>
 #include <asm/processor.h>
 #include <asm/hypervisor.h>
 
 /* Is Linux running as the root partition? */
 bool hv_root_partition;
-EXPORT_SYMBOL_GPL(hv_root_partition);
-
 struct ms_hyperv_info ms_hyperv;
-EXPORT_SYMBOL_GPL(ms_hyperv);
 
 #if IS_ENABLED(CONFIG_HYPERV)
 static void (*vmbus_handler)(void);
@@ -65,14 +61,12 @@ void hv_setup_vmbus_handler(void (*handler)(void))
 {
        vmbus_handler = handler;
 }
-EXPORT_SYMBOL_GPL(hv_setup_vmbus_handler);
 
 void hv_remove_vmbus_handler(void)
 {
        /* We have no way to deallocate the interrupt gate */
        vmbus_handler = NULL;
 }
-EXPORT_SYMBOL_GPL(hv_remove_vmbus_handler);
 
 /*
  * Routines to do per-architecture handling of stimer0
@@ -107,25 +101,21 @@ void hv_setup_kexec_handler(void (*handler)(void))
 {
        hv_kexec_handler = handler;
 }
-EXPORT_SYMBOL_GPL(hv_setup_kexec_handler);
 
 void hv_remove_kexec_handler(void)
 {
        hv_kexec_handler = NULL;
 }
-EXPORT_SYMBOL_GPL(hv_remove_kexec_handler);
 
 void hv_setup_crash_handler(void (*handler)(struct pt_regs *regs))
 {
        hv_crash_handler = handler;
 }
-EXPORT_SYMBOL_GPL(hv_setup_crash_handler);
 
 void hv_remove_crash_handler(void)
 {
        hv_crash_handler = NULL;
 }
-EXPORT_SYMBOL_GPL(hv_remove_crash_handler);
 
 #ifdef CONFIG_KEXEC_CORE
 static void hv_machine_shutdown(void)
@@ -335,16 +325,6 @@ static void __init ms_hyperv_init_platform(void)
                        ms_hyperv.nested_features);
        }
 
-       /*
-        * Hyper-V expects to get crash register data or kmsg when
-        * crash enlightment is available and system crashes. Set
-        * crash_kexec_post_notifiers to be true to make sure that
-        * calling crash enlightment interface before running kdump
-        * kernel.
-        */
-       if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE)
-               crash_kexec_post_notifiers = true;
-
 #ifdef CONFIG_X86_LOCAL_APIC
        if (ms_hyperv.features & HV_ACCESS_FREQUENCY_MSRS &&
            ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {
@@ -373,10 +353,17 @@ static void __init ms_hyperv_init_platform(void)
        machine_ops.crash_shutdown = hv_machine_crash_shutdown;
 #endif
        if (ms_hyperv.features & HV_ACCESS_TSC_INVARIANT) {
+               /*
+                * Writing to synthetic MSR 0x40000118 updates/changes the
+                * guest visible CPUIDs. Setting bit 0 of this MSR  enables
+                * guests to report invariant TSC feature through CPUID
+                * instruction, CPUID 0x800000007/EDX, bit 8. See code in
+                * early_init_intel() where this bit is examined. The
+                * setting of this MSR bit should happen before init_intel()
+                * is called.
+                */
                wrmsrl(HV_X64_MSR_TSC_INVARIANT_CONTROL, 0x1);
                setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE);
-       } else {
-               mark_tsc_unstable("running on Hyper-V");
        }
 
        /*
@@ -437,6 +424,13 @@ static void __init ms_hyperv_init_platform(void)
        /* Register Hyper-V specific clocksource */
        hv_init_clocksource();
 #endif
+       /*
+        * TSC should be marked as unstable only after Hyper-V
+        * clocksource has been initialized. This ensures that the
+        * stability of the sched_clock is not altered.
+        */
+       if (!(ms_hyperv.features & HV_ACCESS_TSC_INVARIANT))
+               mark_tsc_unstable("running on Hyper-V");
 }
 
 static bool __init ms_hyperv_x2apic_available(void)