lkml.org 
[lkml]   [2015]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/12] KVM: x86: Replace call-back set_tsc_khz() with a common function
    Date
    Both VMX and SVM propagate virtual_tsc_khz in the same way, so this
    patch removes the call-back set_tsc_khz() and replaces it with a common
    function.

    Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
    ---
    arch/x86/include/asm/kvm_host.h | 1 -
    arch/x86/kvm/svm.c | 36 ------------------------------------
    arch/x86/kvm/vmx.c | 17 -----------------
    arch/x86/kvm/x86.c | 41 ++++++++++++++++++++++++++++++++++++++++-
    4 files changed, 40 insertions(+), 55 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index 4f32c68..5a0c435 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -842,7 +842,6 @@ struct kvm_x86_ops {

    bool (*has_wbinvd_exit)(void);

    - void (*set_tsc_khz)(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale);
    u64 (*read_tsc_offset)(struct kvm_vcpu *vcpu);
    void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset);

    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index 1a333bd..d46dcf3 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -1015,41 +1015,6 @@ static void init_sys_seg(struct vmcb_seg *seg, uint32_t type)
    seg->base = 0;
    }

    -static void svm_set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
    -{
    - u64 ratio;
    - u64 khz;
    -
    - /* Guest TSC same frequency as host TSC? */
    - if (!scale) {
    - vcpu->arch.tsc_scaling_ratio = TSC_RATIO_DEFAULT;
    - return;
    - }
    -
    - /* TSC scaling supported? */
    - if (!boot_cpu_has(X86_FEATURE_TSCRATEMSR)) {
    - if (user_tsc_khz > tsc_khz) {
    - vcpu->arch.tsc_catchup = 1;
    - vcpu->arch.tsc_always_catchup = 1;
    - } else
    - WARN(1, "user requested TSC rate below hardware speed\n");
    - return;
    - }
    -
    - khz = user_tsc_khz;
    -
    - /* TSC scaling required - calculate ratio */
    - ratio = khz << 32;
    - do_div(ratio, tsc_khz);
    -
    - if (ratio == 0 || ratio & TSC_RATIO_RSVD) {
    - WARN_ONCE(1, "Invalid TSC ratio - virtual-tsc-khz=%u\n",
    - user_tsc_khz);
    - return;
    - }
    - vcpu->arch.tsc_scaling_ratio = ratio;
    -}
    -
    static u64 svm_read_tsc_offset(struct kvm_vcpu *vcpu)
    {
    struct vcpu_svm *svm = to_svm(vcpu);
    @@ -4507,7 +4472,6 @@ static struct kvm_x86_ops svm_x86_ops = {

    .has_wbinvd_exit = svm_has_wbinvd_exit,

    - .set_tsc_khz = svm_set_tsc_khz,
    .read_tsc_offset = svm_read_tsc_offset,
    .write_tsc_offset = svm_write_tsc_offset,
    .adjust_tsc_offset = svm_adjust_tsc_offset,
    diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
    index 6407674..1751537 100644
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -2255,22 +2255,6 @@ static u64 vmx_read_l1_tsc(struct kvm_vcpu *vcpu, u64 host_tsc)
    return host_tsc + tsc_offset;
    }

    -/*
    - * Engage any workarounds for mis-matched TSC rates. Currently limited to
    - * software catchup for faster rates on slower CPUs.
    - */
    -static void vmx_set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
    -{
    - if (!scale)
    - return;
    -
    - if (user_tsc_khz > tsc_khz) {
    - vcpu->arch.tsc_catchup = 1;
    - vcpu->arch.tsc_always_catchup = 1;
    - } else
    - WARN(1, "user requested TSC rate below hardware speed\n");
    -}
    -
    static u64 vmx_read_tsc_offset(struct kvm_vcpu *vcpu)
    {
    return vmcs_read64(TSC_OFFSET);
    @@ -10380,7 +10364,6 @@ static struct kvm_x86_ops vmx_x86_ops = {

    .has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,

    - .set_tsc_khz = vmx_set_tsc_khz,
    .read_tsc_offset = vmx_read_tsc_offset,
    .write_tsc_offset = vmx_write_tsc_offset,
    .adjust_tsc_offset = vmx_adjust_tsc_offset,
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 920c302..e2e1fdb 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -1248,6 +1248,45 @@ static u32 adjust_tsc_khz(u32 khz, s32 ppm)
    return v;
    }

    +static void set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
    +{
    + u64 ratio, khz;
    + s8 shift;
    +
    + /* Guest TSC same frequency as host TSC? */
    + if (!scale) {
    + vcpu->arch.tsc_scaling_ratio = kvm_default_tsc_scaling_ratio;
    + return;
    + }
    +
    + /* TSC scaling supported? */
    + if (!kvm_has_tsc_control) {
    + if (user_tsc_khz > tsc_khz) {
    + vcpu->arch.tsc_catchup = 1;
    + vcpu->arch.tsc_always_catchup = 1;
    + } else
    + WARN(1, "user requested TSC rate below hardware speed\n");
    + return;
    + }
    +
    + khz = user_tsc_khz;
    +
    + /* TSC scaling required - calculate ratio */
    + shift = (kvm_tsc_scaling_ratio_frac_bits <= 32) ?
    + kvm_tsc_scaling_ratio_frac_bits : 32;
    + ratio = khz << shift;
    + do_div(ratio, tsc_khz);
    + ratio <<= (kvm_tsc_scaling_ratio_frac_bits - shift);
    +
    + if (ratio == 0 || ratio & kvm_tsc_scaling_ratio_rsvd) {
    + WARN_ONCE(1, "Invalid TSC scaling ratio - virtual-tsc-khz=%u\n",
    + user_tsc_khz);
    + return;
    + }
    +
    + vcpu->arch.tsc_scaling_ratio = ratio;
    +}
    +
    static void kvm_set_tsc_khz(struct kvm_vcpu *vcpu, u32 this_tsc_khz)
    {
    u32 thresh_lo, thresh_hi;
    @@ -1275,7 +1314,7 @@ static void kvm_set_tsc_khz(struct kvm_vcpu *vcpu, u32 this_tsc_khz)
    pr_debug("kvm: requested TSC rate %u falls outside tolerance [%u,%u]\n", this_tsc_khz, thresh_lo, thresh_hi);
    use_scaling = 1;
    }
    - kvm_x86_ops->set_tsc_khz(vcpu, this_tsc_khz, use_scaling);
    + set_tsc_khz(vcpu, this_tsc_khz, use_scaling);
    }

    static u64 compute_guest_tsc(struct kvm_vcpu *vcpu, s64 kernel_ns)
    --
    2.4.8


    \
     
     \ /
      Last update: 2015-09-28 08:01    [W:4.146 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site