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 v3 09/13] x86/hvm: Replace architecture TSC scaling by a common function
Date: Thu, 31 Dec 2015 11:03:36 +0800	[thread overview]
Message-ID: <1451531020-29964-10-git-send-email-haozhong.zhang@intel.com> (raw)
In-Reply-To: <1451531020-29964-1-git-send-email-haozhong.zhang@intel.com>

This patch implements a common function hvm_scale_tsc() to scale TSC by
using TSC scaling information collected by architecture code.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com> (except the mul64 part)
---
Changes in v3:
 (addressing Boris Ostrovsky's comments)
 * Remove unnecessary assertions in hvm_scale_tsc().
 * Move math64 stuffs to a standalone patch and state their origination.

 xen/arch/x86/hvm/hvm.c        | 15 +++++++++++++--
 xen/arch/x86/hvm/svm/svm.c    | 12 ------------
 xen/arch/x86/time.c           |  2 +-
 xen/include/asm-x86/hvm/hvm.h |  3 +--
 4 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 3bf99b1..a900b4c 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -302,6 +302,17 @@ int hvm_set_guest_pat(struct vcpu *v, u64 guest_pat)
     return 1;
 }
 
+u64 hvm_scale_tsc(const struct vcpu *v, u64 tsc)
+{
+    u64 ratio = v->arch.hvm_vcpu.tsc_scaling_ratio;
+
+    if ( !hvm_funcs.tsc_scaling_supported ||
+         ratio == hvm_funcs.default_tsc_scaling_ratio )
+        return tsc;
+
+    return mul_u64_u64_shr(tsc, ratio, hvm_funcs.tsc_scaling_ratio_frac_bits);
+}
+
 bool_t hvm_validate_tsc_scaling_ratio(uint32_t gtsc_khz)
 {
     u64 ratio;
@@ -352,7 +363,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc, u64 at_tsc)
     {
         tsc = at_tsc ?: rdtsc();
         if ( cpu_has_tsc_ratio )
-            tsc = hvm_funcs.scale_tsc(v, tsc);
+            tsc = hvm_scale_tsc(v, tsc);
     }
 
     delta_tsc = guest_tsc - tsc;
@@ -384,7 +395,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t at_tsc)
     {
         tsc = at_tsc ?: rdtsc();
         if ( cpu_has_tsc_ratio )
-            tsc = hvm_funcs.scale_tsc(v, tsc);
+            tsc = hvm_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 b58f1e8..71538c8 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -804,16 +804,6 @@ static uint64_t scale_tsc(uint64_t host_tsc, uint64_t ratio)
     return scaled_host_tsc;
 }
 
-static uint64_t svm_scale_tsc(struct vcpu *v, uint64_t tsc)
-{
-    struct domain *d = v->domain;
-
-    if ( !cpu_has_tsc_ratio || d->arch.vtsc )
-        return tsc;
-
-    return scale_tsc(tsc, v->arch.hvm_vcpu.tsc_scaling_ratio);
-}
-
 static uint64_t svm_get_tsc_offset(uint64_t host_tsc, uint64_t guest_tsc,
     uint64_t ratio)
 {
@@ -2276,8 +2266,6 @@ static struct hvm_function_table __initdata svm_function_table = {
     .nhvm_intr_blocked = nsvm_intr_blocked,
     .nhvm_hap_walk_L1_p2m = nsvm_hap_walk_L1_p2m,
 
-    .scale_tsc            = svm_scale_tsc,
-
     .default_tsc_scaling_ratio   = DEFAULT_TSC_RATIO,
     .max_tsc_scaling_ratio       = ~TSC_RATIO_RSVD_BITS,
     .tsc_scaling_ratio_frac_bits = 32,
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index e69d9de..8d391e0 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -817,7 +817,7 @@ static void __update_vcpu_system_time(struct vcpu *v, int force)
     {
         if ( has_hvm_container_domain(d) && cpu_has_tsc_ratio )
         {
-            tsc_stamp            = hvm_funcs.scale_tsc(v, t->local_tsc_stamp);
+            tsc_stamp            = hvm_scale_tsc(v, t->local_tsc_stamp);
             _u.tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
             _u.tsc_shift         = d->arch.vtsc_to_ns.shift;
         }
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
index 6b49da8..05894ee 100644
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -225,8 +225,6 @@ struct hvm_function_table {
     bool_t (*altp2m_vcpu_emulate_ve)(struct vcpu *v);
     int (*altp2m_vcpu_emulate_vmfunc)(struct cpu_user_regs *regs);
 
-    uint64_t (*scale_tsc)(struct vcpu *v, uint64_t tsc);
-
     /* Architecture function to setup TSC scaling ratio */
     void (*setup_tsc_scaling)(struct vcpu *v);
 };
@@ -264,6 +262,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc, u64 at_tsc);
 u64 hvm_get_guest_tsc_fixed(struct vcpu *v, u64 at_tsc);
 #define hvm_get_guest_tsc(v) hvm_get_guest_tsc_fixed(v, 0)
 
+u64 hvm_scale_tsc(const struct vcpu *v, u64 tsc);
 bool_t hvm_validate_tsc_scaling_ratio(uint32_t gtsc_khz);
 void hvm_setup_tsc_scaling(struct vcpu *v);
 
-- 
2.4.8

  parent reply	other threads:[~2015-12-31  3:03 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-31  3:03 [PATCH v3 00/13] Add VMX TSC scaling support Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 01/13] x86/time.c: Use correct guest TSC frequency in tsc_set_info() Haozhong Zhang
2016-01-04 17:44   ` Boris Ostrovsky
2015-12-31  3:03 ` [PATCH v3 02/13] x86/time.c: Use correct guest TSC frequency in tsc_get_info() Haozhong Zhang
2016-01-04 17:48   ` Boris Ostrovsky
2016-01-05  0:32     ` Haozhong Zhang
2016-01-08  9:05     ` Jan Beulich
2016-01-08  9:12       ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 03/13] x86/hvm: Scale host TSC when setting/getting guest TSC Haozhong Zhang
2016-01-08  9:15   ` Jan Beulich
2016-01-08 14:04     ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 04/13] x86/time.c: Scale host TSC in pvclock properly Haozhong Zhang
2016-01-04 18:09   ` Boris Ostrovsky
2016-01-05  0:59     ` Haozhong Zhang
2016-01-05 16:15       ` Boris Ostrovsky
2016-01-06  0:56         ` Haozhong Zhang
2016-01-08  9:20   ` Jan Beulich
2016-01-08 13:22     ` Haozhong Zhang
2016-01-08 13:43       ` Jan Beulich
2016-01-08 13:50         ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 05/13] svm: Remove redundant TSC scaling in svm_set_tsc_offset() Haozhong Zhang
2016-01-08  9:22   ` Jan Beulich
2016-01-08 13:24     ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 06/13] x86/hvm: Collect information of TSC scaling ratio Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 07/13] x86: Add functions for 64-bit integer arithmetic Haozhong Zhang
2016-01-04 18:26   ` Boris Ostrovsky
2016-01-05  1:15     ` Haozhong Zhang
2016-01-05 16:21       ` Boris Ostrovsky
2016-01-08  9:34   ` Jan Beulich
2016-01-08 13:48     ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 08/13] x86/hvm: Setup TSC scaling ratio Haozhong Zhang
2016-01-04 18:40   ` Boris Ostrovsky
2016-01-05  1:20     ` Haozhong Zhang
2016-01-08  9:44   ` Jan Beulich
2016-01-08 13:55     ` Haozhong Zhang
2016-01-08 14:04       ` Jan Beulich
2016-01-08 14:10         ` Haozhong Zhang
2015-12-31  3:03 ` Haozhong Zhang [this message]
2016-01-04 18:42   ` [PATCH v3 09/13] x86/hvm: Replace architecture TSC scaling by a common function Boris Ostrovsky
2016-01-12 16:44   ` Jan Beulich
2015-12-31  3:03 ` [PATCH v3 10/13] x86/hvm: Move saving/loading vcpu's TSC to common code Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 11/13] x86/hvm: Detect TSC scaling through hvm_funcs Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 12/13] vmx: Add VMX RDTSC(P) scaling support Haozhong Zhang
2016-01-12 16:48   ` Jan Beulich
2016-01-14  4:52     ` Haozhong Zhang
2016-01-14  9:05       ` Jan Beulich
2016-01-14  9:47         ` Haozhong Zhang
2015-12-31  3:03 ` [PATCH v3 13/13] docs: Add descriptions of TSC scaling in xl.cfg and tscmode.txt Haozhong Zhang

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=1451531020-29964-10-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.