lkml.org 
[lkml]   [2017]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Commit-ID:  71c2a2d0a81f096a2932fccb39a500116fece554
    Gitweb: http://git.kernel.org/tip/71c2a2d0a81f096a2932fccb39a500116fece554
    Author: Vitaly Kuznetsov <vkuznets@redhat.com>
    AuthorDate: Thu, 22 Jun 2017 18:07:30 +0800
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Thu, 22 Jun 2017 15:35:12 +0200

    x86/hyperv: Read TSC frequency from a synthetic MSR

    It was found that SMI_TRESHOLD of 50000 is not enough for Hyper-V
    guests in nested environment and falling back to counting jiffies
    is not an option for Gen2 guests as they don't have PIT. As Hyper-V
    provides TSC frequency in a synthetic MSR we can just use this information
    instead of doing a error prone calibration.

    Reported-and-tested-by: Ladi Prosek <lprosek@redhat.com>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Stephen Hemminger <sthemmin@microsoft.com>
    Cc: Haiyang Zhang <haiyangz@microsoft.com>
    Cc: Jork Loeser <jloeser@microsoft.com>
    Cc: devel@linuxdriverproject.org
    Cc: "K. Y. Srinivasan" <kys@microsoft.com>
    Link: http://lkml.kernel.org/r/20170622100730.18112-3-vkuznets@redhat.com

    ---
    arch/x86/kernel/cpu/mshyperv.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
    index 3563c8e..70e717f 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -161,6 +161,15 @@ static int hv_nmi_unknown(unsigned int val, struct pt_regs *regs)
    }
    #endif

    +static unsigned long hv_get_tsc_khz(void)
    +{
    + unsigned long freq;
    +
    + rdmsrl(HV_X64_MSR_TSC_FREQUENCY, freq);
    +
    + return freq / 1000;
    +}
    +
    static void __init ms_hyperv_init_platform(void)
    {
    int hv_host_info_eax;
    @@ -193,6 +202,12 @@ static void __init ms_hyperv_init_platform(void)
    hv_host_info_edx >> 24, hv_host_info_edx & 0xFFFFFF);
    }

    + if (ms_hyperv.features & HV_X64_ACCESS_FREQUENCY_MSRS &&
    + ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {
    + x86_platform.calibrate_tsc = hv_get_tsc_khz;
    + x86_platform.calibrate_cpu = hv_get_tsc_khz;
    + }
    +
    #ifdef CONFIG_X86_LOCAL_APIC
    if (ms_hyperv.features & HV_X64_ACCESS_FREQUENCY_MSRS &&
    ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {
    \
     
     \ /
      Last update: 2017-06-22 20:03    [W:2.898 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site