All of lore.kernel.org
 help / color / mirror / Atom feed
From: Haozhong Zhang <haozhong.zhang@intel.com>
To: xen-devel@lists.xen.org, Jan Beulich <jbeulich@suse.com>,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	Kevin Tian <kevin.tian@intel.com>
Cc: Haozhong Zhang <haozhong.zhang@intel.com>,
	Keir Fraser <keir@xen.org>,
	Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
	Jun Nakajima <jun.nakajima@intel.com>
Subject: [PATCH v4 01/10] x86/hvm: Scale host TSC when setting/getting guest TSC
Date: Mon, 18 Jan 2016 05:58:50 +0800	[thread overview]
Message-ID: <1453067939-9121-2-git-send-email-haozhong.zhang@intel.com> (raw)
In-Reply-To: <1453067939-9121-1-git-send-email-haozhong.zhang@intel.com>

The existing hvm_[set|get]_guest_tsc_fixed() calculate the guest TSC by
adding the TSC offset to the host TSC. When the TSC scaling is enabled,
the host TSC should be scaled first. This patch adds the scaling logic
to those two functions.

Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
Changes in v4:
 (addressing Jan Beulich's comments)
 * Remove redundant check of cpu_has_tsc_ratio in svm_scale_tsc().
 * Move check of d->arch.vtsc in svm_scale_tsc() to callers.

 xen/arch/x86/hvm/hvm.c        | 17 +++++++----------
 xen/arch/x86/hvm/svm/svm.c    |  9 +++++++++
 xen/include/asm-x86/hvm/hvm.h |  2 ++
 3 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 21470ec..3648a44 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -60,6 +60,7 @@
 #include <asm/hvm/nestedhvm.h>
 #include <asm/hvm/event.h>
 #include <asm/hvm/vmx/vmx.h>
+#include <asm/hvm/svm/svm.h> /* for cpu_has_tsc_ratio */
 #include <asm/altp2m.h>
 #include <asm/mtrr.h>
 #include <asm/apic.h>
@@ -310,13 +311,11 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc, u64 at_tsc)
         tsc = hvm_get_guest_time_fixed(v, at_tsc);
         tsc = gtime_to_gtsc(v->domain, tsc);
     }
-    else if ( at_tsc )
-    {
-        tsc = at_tsc;
-    }
     else
     {
-        tsc = rdtsc();
+        tsc = at_tsc ?: rdtsc();
+        if ( cpu_has_tsc_ratio )
+            tsc = hvm_funcs.scale_tsc(v, tsc);
     }
 
     delta_tsc = guest_tsc - tsc;
@@ -344,13 +343,11 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t at_tsc)
         tsc = hvm_get_guest_time_fixed(v, at_tsc);
         tsc = gtime_to_gtsc(v->domain, tsc);
     }
-    else if ( at_tsc )
-    {
-        tsc = at_tsc;
-    }
     else
     {
-        tsc = rdtsc();
+        tsc = at_tsc ?: rdtsc();
+        if ( cpu_has_tsc_ratio )
+            tsc = hvm_funcs.scale_tsc(v, tsc);
     }
 
     return tsc + v->arch.hvm_vcpu.cache_tsc_offset;
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index a66d854..a46bc98 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -804,6 +804,13 @@ static uint64_t scale_tsc(uint64_t host_tsc, uint64_t ratio)
     return scaled_host_tsc;
 }
 
+static uint64_t svm_scale_tsc(const struct vcpu *v, uint64_t tsc)
+{
+    ASSERT(cpu_has_tsc_ratio && !v->domain->arch.vtsc);
+
+    return scale_tsc(tsc, vcpu_tsc_ratio(v));
+}
+
 static uint64_t svm_get_tsc_offset(uint64_t host_tsc, uint64_t guest_tsc,
     uint64_t ratio)
 {
@@ -2272,6 +2279,8 @@ static struct hvm_function_table __initdata svm_function_table = {
     .nhvm_vmcx_hap_enabled = nsvm_vmcb_hap_enabled,
     .nhvm_intr_blocked = nsvm_intr_blocked,
     .nhvm_hap_walk_L1_p2m = nsvm_hap_walk_L1_p2m,
+
+    .scale_tsc            = svm_scale_tsc,
 };
 
 void svm_vmexit_handler(struct cpu_user_regs *regs)
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
index b9d893d..a87224b 100644
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -212,6 +212,8 @@ struct hvm_function_table {
     void (*altp2m_vcpu_update_vmfunc_ve)(struct vcpu *v);
     bool_t (*altp2m_vcpu_emulate_ve)(struct vcpu *v);
     int (*altp2m_vcpu_emulate_vmfunc)(struct cpu_user_regs *regs);
+
+    uint64_t (*scale_tsc)(const struct vcpu *v, uint64_t tsc);
 };
 
 extern struct hvm_function_table hvm_funcs;
-- 
2.7.0

  reply	other threads:[~2016-01-17 21:58 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-17 21:58 [PATCH v4 00/10] Add VMX TSC scaling support Haozhong Zhang
2016-01-17 21:58 ` Haozhong Zhang [this message]
2016-01-18 13:39   ` [PATCH v4 01/10] x86/hvm: Scale host TSC when setting/getting guest TSC Jan Beulich
2016-01-19  0:17     ` Haozhong Zhang
2016-01-19 14:27     ` Boris Ostrovsky
2016-01-17 21:58 ` [PATCH v4 02/10] x86/time.c: Scale host TSC in pvclock properly Haozhong Zhang
2016-01-18 13:42   ` Jan Beulich
2016-01-19  0:29     ` Haozhong Zhang
2016-01-17 21:58 ` [PATCH v4 03/10] svm: Remove redundant TSC scaling in svm_set_tsc_offset() Haozhong Zhang
2016-01-17 21:58 ` [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio Haozhong Zhang
2016-01-18 10:45   ` Egger, Christoph
2016-01-19  3:19     ` Haozhong Zhang
2016-02-05 11:41   ` Jan Beulich
2016-02-16  7:59     ` Zhang, Haozhong
2016-01-17 21:58 ` [PATCH v4 05/10] x86: Add functions for 64-bit integer arithmetic Haozhong Zhang
2016-02-05 13:36   ` Jan Beulich
2016-02-16  9:02     ` Zhang, Haozhong
2016-02-16  9:39       ` Jan Beulich
2016-02-16  9:57         ` Haozhong Zhang
2016-01-17 21:58 ` [PATCH v4 06/10] x86/hvm: Setup TSC scaling ratio Haozhong Zhang
2016-02-05 13:54   ` Jan Beulich
2016-02-16  9:44     ` Zhang, Haozhong
2016-02-16 10:12       ` Jan Beulich
2016-01-17 21:58 ` [PATCH v4 07/10] x86/hvm: Replace architecture TSC scaling by a common function Haozhong Zhang
2016-01-17 21:58 ` [PATCH v4 08/10] x86/hvm: Move saving/loading vcpu's TSC to common code Haozhong Zhang
2016-01-17 21:58 ` [PATCH v4 09/10] vmx: Add VMX RDTSC(P) scaling support Haozhong Zhang
2016-01-19  2:55   ` [RESEND PATCH " Haozhong Zhang
2016-02-05 14:06     ` Jan Beulich
2016-02-16  7:59       ` Zhang, Haozhong
2016-01-17 21:58 ` [PATCH v4 10/10] docs: Add descriptions of TSC scaling in xl.cfg and tscmode.txt Haozhong Zhang
2016-02-01  5:50 ` [PATCH v4 00/10] Add VMX TSC scaling support Haozhong Zhang
2016-02-01  7:54   ` Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1453067939-9121-2-git-send-email-haozhong.zhang@intel.com \
    --to=haozhong.zhang@intel.com \
    --cc=Aravind.Gopalakrishnan@amd.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=jbeulich@suse.com \
    --cc=jun.nakajima@intel.com \
    --cc=keir@xen.org \
    --cc=kevin.tian@intel.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.