Re: [Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio

2016-02-16 Thread Zhang, Haozhong
On 02/05/16 19:41, Jan Beulich wrote:
> >>> On 17.01.16 at 22:58,  wrote:
> > Both VMX TSC scaling and SVM TSC ratio use the 64-bit TSC scaling ratio,
> > but the number of fractional bits of the ratio is different between VMX
> > and SVM. This patch adds the architecture code to collect the number of
> > fractional bits and other related information into fields of struct
> > hvm_function_table so that they can be used in the common code.
> > 
> > Signed-off-by: Haozhong Zhang 
> > Reviewed-by: Kevin Tian 
> > Reviewed-by: Boris Ostrovsky 
> > ---
> > Changes in v4:
> >  (addressing Jan Beulich's comments in v3 patch 12)
> >  * Set TSC scaling parameters in hvm_funcs conditionally.
> >  * Remove TSC scaling parameter tsc_scaling_supported in hvm_funcs which
> >can be derived from other parameters.
> >  (code cleanup)
> >  * Merge with v3 patch 11 "x86/hvm: Detect TSC scaling through hvm_funcs"
> >whose work can be done early in this patch.
> 
> I really think this the scope of these changes should have invalidated
> all earlier tags.
>

I'll remove all R-b tags.

> > --- a/xen/arch/x86/hvm/svm/svm.c
> > +++ b/xen/arch/x86/hvm/svm/svm.c
> > @@ -1450,6 +1450,14 @@ const struct hvm_function_table * __init 
> > start_svm(void)
> >  if ( !cpu_has_svm_nrips )
> >  clear_bit(SVM_FEATURE_DECODEASSISTS, _feature_flags);
> >  
> > +if ( cpu_has_tsc_ratio )
> > +{
> > +svm_function_table.default_tsc_scaling_ratio = DEFAULT_TSC_RATIO;
> > +svm_function_table.max_tsc_scaling_ratio = ~TSC_RATIO_RSVD_BITS;
> > +svm_function_table.tsc_scaling_ratio_frac_bits = 32;
> > +svm_function_table.scale_tsc = svm_scale_tsc;
> > +}
> > +
> >  #define P(p,s) if ( p ) { printk(" - %s\n", s); printed = 1; }
> >  P(cpu_has_svm_npt, "Nested Page Tables (NPT)");
> >  P(cpu_has_svm_lbrv, "Last Branch Record (LBR) Virtualisation");
> > @@ -2269,8 +2277,6 @@ 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,
> >  };
> 
> From at the first glance purely mechanical POV this change was
> unnecessary with ...
> 
> > @@ -249,6 +261,8 @@ 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)
> >  
> > +#define hvm_tsc_scaling_supported (!!hvm_funcs.default_tsc_scaling_ratio)
> 
> ... this, but considering our general aim to avoid having NULL
> callback pointers wherever possible, I think this is more than just
> a mechanical concern: I'd prefer if at least the callback pointer
> always be statically initialized, and ideally also two of the other
> fields. Only one field should be dynamically initialized (unless -
> considering the VMX code to come - static initialization is
> impossible), and ideally one which, if zero, would not have any
> bad consequences if used by mistake (frac_bits maybe). And
> perhaps an ASSERT() should be placed inside svm_scale_tsc()
> making sure the dynamically initialized field actually is initialized.
>

Combined with your comments for patch 9, I'll leave only
tsc_scaling_ratio_frac_bits to be dynamically initialized.

> The conditional here would then check _all_ fields which either
> vendor's code leaves uninitialized (i.e. the VMX patch may then
> add to the above).
>

so it would be
#define hvm_tsc_scaling_supported (!!hvm_funcs.tsc_scaling_ratio_frac_bits)


Thanks,
Haozhong

___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


Re: [Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio

2016-02-05 Thread Jan Beulich
>>> On 17.01.16 at 22:58,  wrote:
> Both VMX TSC scaling and SVM TSC ratio use the 64-bit TSC scaling ratio,
> but the number of fractional bits of the ratio is different between VMX
> and SVM. This patch adds the architecture code to collect the number of
> fractional bits and other related information into fields of struct
> hvm_function_table so that they can be used in the common code.
> 
> Signed-off-by: Haozhong Zhang 
> Reviewed-by: Kevin Tian 
> Reviewed-by: Boris Ostrovsky 
> ---
> Changes in v4:
>  (addressing Jan Beulich's comments in v3 patch 12)
>  * Set TSC scaling parameters in hvm_funcs conditionally.
>  * Remove TSC scaling parameter tsc_scaling_supported in hvm_funcs which
>can be derived from other parameters.
>  (code cleanup)
>  * Merge with v3 patch 11 "x86/hvm: Detect TSC scaling through hvm_funcs"
>whose work can be done early in this patch.

I really think this the scope of these changes should have invalidated
all earlier tags.

> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -1450,6 +1450,14 @@ const struct hvm_function_table * __init 
> start_svm(void)
>  if ( !cpu_has_svm_nrips )
>  clear_bit(SVM_FEATURE_DECODEASSISTS, _feature_flags);
>  
> +if ( cpu_has_tsc_ratio )
> +{
> +svm_function_table.default_tsc_scaling_ratio = DEFAULT_TSC_RATIO;
> +svm_function_table.max_tsc_scaling_ratio = ~TSC_RATIO_RSVD_BITS;
> +svm_function_table.tsc_scaling_ratio_frac_bits = 32;
> +svm_function_table.scale_tsc = svm_scale_tsc;
> +}
> +
>  #define P(p,s) if ( p ) { printk(" - %s\n", s); printed = 1; }
>  P(cpu_has_svm_npt, "Nested Page Tables (NPT)");
>  P(cpu_has_svm_lbrv, "Last Branch Record (LBR) Virtualisation");
> @@ -2269,8 +2277,6 @@ 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,
>  };

>From at the first glance purely mechanical POV this change was
unnecessary with ...

> @@ -249,6 +261,8 @@ 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)
>  
> +#define hvm_tsc_scaling_supported (!!hvm_funcs.default_tsc_scaling_ratio)

... this, but considering our general aim to avoid having NULL
callback pointers wherever possible, I think this is more than just
a mechanical concern: I'd prefer if at least the callback pointer
always be statically initialized, and ideally also two of the other
fields. Only one field should be dynamically initialized (unless -
considering the VMX code to come - static initialization is
impossible), and ideally one which, if zero, would not have any
bad consequences if used by mistake (frac_bits maybe). And
perhaps an ASSERT() should be placed inside svm_scale_tsc()
making sure the dynamically initialized field actually is initialized.

The conditional here would then check _all_ fields which either
vendor's code leaves uninitialized (i.e. the VMX patch may then
add to the above).

Jan


___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


Re: [Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio

2016-01-18 Thread Egger, Christoph
On 17/01/16 22:58, Haozhong Zhang wrote:
> Both VMX TSC scaling and SVM TSC ratio use the 64-bit TSC scaling ratio,
> but the number of fractional bits of the ratio is different between VMX
> and SVM. This patch adds the architecture code to collect the number of
> fractional bits and other related information into fields of struct
> hvm_function_table so that they can be used in the common code.
> 
> Signed-off-by: Haozhong Zhang 
> Reviewed-by: Kevin Tian 
> Reviewed-by: Boris Ostrovsky 
> ---
> Changes in v4:
>  (addressing Jan Beulich's comments in v3 patch 12)
>  * Set TSC scaling parameters in hvm_funcs conditionally.
>  * Remove TSC scaling parameter tsc_scaling_supported in hvm_funcs which
>can be derived from other parameters.
>  (code cleanup)
>  * Merge with v3 patch 11 "x86/hvm: Detect TSC scaling through hvm_funcs"
>whose work can be done early in this patch.
> 
>  xen/arch/x86/hvm/hvm.c|  4 ++--
>  xen/arch/x86/hvm/svm/svm.c| 10 --
>  xen/arch/x86/time.c   |  9 -
>  xen/include/asm-x86/hvm/hvm.h | 14 ++
>  4 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 3648a44..6d30d8b 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -314,7 +314,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 
> guest_tsc, u64 at_tsc)
>  else
>  {
>  tsc = at_tsc ?: rdtsc();
> -if ( cpu_has_tsc_ratio )
> +if ( hvm_tsc_scaling_supported )
>  tsc = hvm_funcs.scale_tsc(v, tsc);
>  }
>  
> @@ -346,7 +346,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t 
> at_tsc)
>  else
>  {
>  tsc = at_tsc ?: rdtsc();
> -if ( cpu_has_tsc_ratio )
> +if ( hvm_tsc_scaling_supported )
>  tsc = hvm_funcs.scale_tsc(v, tsc);
>  }
>  
> diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> index 953e0b5..8b316a0 100644
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -1450,6 +1450,14 @@ const struct hvm_function_table * __init 
> start_svm(void)
>  if ( !cpu_has_svm_nrips )
>  clear_bit(SVM_FEATURE_DECODEASSISTS, _feature_flags);
>  
> +if ( cpu_has_tsc_ratio )
> +{
> +svm_function_table.default_tsc_scaling_ratio = DEFAULT_TSC_RATIO;
> +svm_function_table.max_tsc_scaling_ratio = ~TSC_RATIO_RSVD_BITS;
> +svm_function_table.tsc_scaling_ratio_frac_bits = 32;
> +svm_function_table.scale_tsc = svm_scale_tsc;
> +}
> +
>  #define P(p,s) if ( p ) { printk(" - %s\n", s); printed = 1; }
>  P(cpu_has_svm_npt, "Nested Page Tables (NPT)");
>  P(cpu_has_svm_lbrv, "Last Branch Record (LBR) Virtualisation");
> @@ -2269,8 +2277,6 @@ 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/arch/x86/time.c b/xen/arch/x86/time.c
> index 988403a..a243bc3 100644
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -37,7 +37,6 @@
>  #include 
>  #include 
>  #include  /* for early_time_init */
> -#include  /* for cpu_has_tsc_ratio */
>  #include 
>  
>  /* opt_clocksource: Force clocksource to one of: pit, hpet, acpi. */
> @@ -815,7 +814,7 @@ static void __update_vcpu_system_time(struct vcpu *v, int 
> force)
>  }
>  else
>  {
> -if ( has_hvm_container_domain(d) && cpu_has_tsc_ratio )
> +if ( has_hvm_container_domain(d) && hvm_tsc_scaling_supported )
>  {
>  tsc_stamp= hvm_funcs.scale_tsc(v, 
> t->local_tsc_stamp);
>  _u.tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
> @@ -1758,7 +1757,7 @@ void tsc_get_info(struct domain *d, uint32_t *tsc_mode,
>uint32_t *incarnation)
>  {
>  bool_t enable_tsc_scaling = has_hvm_container_domain(d) &&
> -cpu_has_tsc_ratio && !d->arch.vtsc;
> +hvm_tsc_scaling_supported && !d->arch.vtsc;
>  
>  *incarnation = d->arch.incarnation;
>  *tsc_mode = d->arch.tsc_mode;
> @@ -1865,7 +1864,7 @@ void tsc_set_info(struct domain *d,
>   */
>  if ( tsc_mode == TSC_MODE_DEFAULT && host_tsc_is_safe() &&
>   (has_hvm_container_domain(d) ?
> -  d->arch.tsc_khz == cpu_khz || cpu_has_tsc_ratio :
> +  d->arch.tsc_khz == cpu_khz || hvm_tsc_scaling_supported :
>incarnation == 0) )

cpu_khz varies not only across different machines with exact same
CPU and same nominal cpu frequency it even differs across a reboot.
This breaks migration when you migrate forth and back. This is a

Re: [Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio

2016-01-18 Thread Haozhong Zhang
On 01/18/16 11:45, Egger, Christoph wrote:
> On 17/01/16 22:58, Haozhong Zhang wrote:
> > Both VMX TSC scaling and SVM TSC ratio use the 64-bit TSC scaling ratio,
> > but the number of fractional bits of the ratio is different between VMX
> > and SVM. This patch adds the architecture code to collect the number of
> > fractional bits and other related information into fields of struct
> > hvm_function_table so that they can be used in the common code.
> > 
> > Signed-off-by: Haozhong Zhang 
> > Reviewed-by: Kevin Tian 
> > Reviewed-by: Boris Ostrovsky 
> > ---
> > Changes in v4:
> >  (addressing Jan Beulich's comments in v3 patch 12)
> >  * Set TSC scaling parameters in hvm_funcs conditionally.
> >  * Remove TSC scaling parameter tsc_scaling_supported in hvm_funcs which
> >can be derived from other parameters.
> >  (code cleanup)
> >  * Merge with v3 patch 11 "x86/hvm: Detect TSC scaling through hvm_funcs"
> >whose work can be done early in this patch.
> > 
> >  xen/arch/x86/hvm/hvm.c|  4 ++--
> >  xen/arch/x86/hvm/svm/svm.c| 10 --
> >  xen/arch/x86/time.c   |  9 -
> >  xen/include/asm-x86/hvm/hvm.h | 14 ++
> >  4 files changed, 28 insertions(+), 9 deletions(-)
> > 
> > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> > index 3648a44..6d30d8b 100644
> > --- a/xen/arch/x86/hvm/hvm.c
> > +++ b/xen/arch/x86/hvm/hvm.c
> > @@ -314,7 +314,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 
> > guest_tsc, u64 at_tsc)
> >  else
> >  {
> >  tsc = at_tsc ?: rdtsc();
> > -if ( cpu_has_tsc_ratio )
> > +if ( hvm_tsc_scaling_supported )
> >  tsc = hvm_funcs.scale_tsc(v, tsc);
> >  }
> >  
> > @@ -346,7 +346,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t 
> > at_tsc)
> >  else
> >  {
> >  tsc = at_tsc ?: rdtsc();
> > -if ( cpu_has_tsc_ratio )
> > +if ( hvm_tsc_scaling_supported )
> >  tsc = hvm_funcs.scale_tsc(v, tsc);
> >  }
> >  
> > diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> > index 953e0b5..8b316a0 100644
> > --- a/xen/arch/x86/hvm/svm/svm.c
> > +++ b/xen/arch/x86/hvm/svm/svm.c
> > @@ -1450,6 +1450,14 @@ const struct hvm_function_table * __init 
> > start_svm(void)
> >  if ( !cpu_has_svm_nrips )
> >  clear_bit(SVM_FEATURE_DECODEASSISTS, _feature_flags);
> >  
> > +if ( cpu_has_tsc_ratio )
> > +{
> > +svm_function_table.default_tsc_scaling_ratio = DEFAULT_TSC_RATIO;
> > +svm_function_table.max_tsc_scaling_ratio = ~TSC_RATIO_RSVD_BITS;
> > +svm_function_table.tsc_scaling_ratio_frac_bits = 32;
> > +svm_function_table.scale_tsc = svm_scale_tsc;
> > +}
> > +
> >  #define P(p,s) if ( p ) { printk(" - %s\n", s); printed = 1; }
> >  P(cpu_has_svm_npt, "Nested Page Tables (NPT)");
> >  P(cpu_has_svm_lbrv, "Last Branch Record (LBR) Virtualisation");
> > @@ -2269,8 +2277,6 @@ 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/arch/x86/time.c b/xen/arch/x86/time.c
> > index 988403a..a243bc3 100644
> > --- a/xen/arch/x86/time.c
> > +++ b/xen/arch/x86/time.c
> > @@ -37,7 +37,6 @@
> >  #include 
> >  #include 
> >  #include  /* for early_time_init */
> > -#include  /* for cpu_has_tsc_ratio */
> >  #include 
> >  
> >  /* opt_clocksource: Force clocksource to one of: pit, hpet, acpi. */
> > @@ -815,7 +814,7 @@ static void __update_vcpu_system_time(struct vcpu *v, 
> > int force)
> >  }
> >  else
> >  {
> > -if ( has_hvm_container_domain(d) && cpu_has_tsc_ratio )
> > +if ( has_hvm_container_domain(d) && hvm_tsc_scaling_supported )
> >  {
> >  tsc_stamp= hvm_funcs.scale_tsc(v, 
> > t->local_tsc_stamp);
> >  _u.tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
> > @@ -1758,7 +1757,7 @@ void tsc_get_info(struct domain *d, uint32_t 
> > *tsc_mode,
> >uint32_t *incarnation)
> >  {
> >  bool_t enable_tsc_scaling = has_hvm_container_domain(d) &&
> > -cpu_has_tsc_ratio && !d->arch.vtsc;
> > +hvm_tsc_scaling_supported && !d->arch.vtsc;
> >  
> >  *incarnation = d->arch.incarnation;
> >  *tsc_mode = d->arch.tsc_mode;
> > @@ -1865,7 +1864,7 @@ void tsc_set_info(struct domain *d,
> >   */
> >  if ( tsc_mode == TSC_MODE_DEFAULT && host_tsc_is_safe() &&
> >   (has_hvm_container_domain(d) ?
> > -  d->arch.tsc_khz == cpu_khz || cpu_has_tsc_ratio :
> > +  d->arch.tsc_khz 

[Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio

2016-01-17 Thread Haozhong Zhang
Both VMX TSC scaling and SVM TSC ratio use the 64-bit TSC scaling ratio,
but the number of fractional bits of the ratio is different between VMX
and SVM. This patch adds the architecture code to collect the number of
fractional bits and other related information into fields of struct
hvm_function_table so that they can be used in the common code.

Signed-off-by: Haozhong Zhang 
Reviewed-by: Kevin Tian 
Reviewed-by: Boris Ostrovsky 
---
Changes in v4:
 (addressing Jan Beulich's comments in v3 patch 12)
 * Set TSC scaling parameters in hvm_funcs conditionally.
 * Remove TSC scaling parameter tsc_scaling_supported in hvm_funcs which
   can be derived from other parameters.
 (code cleanup)
 * Merge with v3 patch 11 "x86/hvm: Detect TSC scaling through hvm_funcs"
   whose work can be done early in this patch.

 xen/arch/x86/hvm/hvm.c|  4 ++--
 xen/arch/x86/hvm/svm/svm.c| 10 --
 xen/arch/x86/time.c   |  9 -
 xen/include/asm-x86/hvm/hvm.h | 14 ++
 4 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 3648a44..6d30d8b 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -314,7 +314,7 @@ void hvm_set_guest_tsc_fixed(struct vcpu *v, u64 guest_tsc, 
u64 at_tsc)
 else
 {
 tsc = at_tsc ?: rdtsc();
-if ( cpu_has_tsc_ratio )
+if ( hvm_tsc_scaling_supported )
 tsc = hvm_funcs.scale_tsc(v, tsc);
 }
 
@@ -346,7 +346,7 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t at_tsc)
 else
 {
 tsc = at_tsc ?: rdtsc();
-if ( cpu_has_tsc_ratio )
+if ( hvm_tsc_scaling_supported )
 tsc = hvm_funcs.scale_tsc(v, tsc);
 }
 
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 953e0b5..8b316a0 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1450,6 +1450,14 @@ const struct hvm_function_table * __init start_svm(void)
 if ( !cpu_has_svm_nrips )
 clear_bit(SVM_FEATURE_DECODEASSISTS, _feature_flags);
 
+if ( cpu_has_tsc_ratio )
+{
+svm_function_table.default_tsc_scaling_ratio = DEFAULT_TSC_RATIO;
+svm_function_table.max_tsc_scaling_ratio = ~TSC_RATIO_RSVD_BITS;
+svm_function_table.tsc_scaling_ratio_frac_bits = 32;
+svm_function_table.scale_tsc = svm_scale_tsc;
+}
+
 #define P(p,s) if ( p ) { printk(" - %s\n", s); printed = 1; }
 P(cpu_has_svm_npt, "Nested Page Tables (NPT)");
 P(cpu_has_svm_lbrv, "Last Branch Record (LBR) Virtualisation");
@@ -2269,8 +2277,6 @@ 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/arch/x86/time.c b/xen/arch/x86/time.c
index 988403a..a243bc3 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -37,7 +37,6 @@
 #include 
 #include 
 #include  /* for early_time_init */
-#include  /* for cpu_has_tsc_ratio */
 #include 
 
 /* opt_clocksource: Force clocksource to one of: pit, hpet, acpi. */
@@ -815,7 +814,7 @@ static void __update_vcpu_system_time(struct vcpu *v, int 
force)
 }
 else
 {
-if ( has_hvm_container_domain(d) && cpu_has_tsc_ratio )
+if ( has_hvm_container_domain(d) && hvm_tsc_scaling_supported )
 {
 tsc_stamp= hvm_funcs.scale_tsc(v, t->local_tsc_stamp);
 _u.tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
@@ -1758,7 +1757,7 @@ void tsc_get_info(struct domain *d, uint32_t *tsc_mode,
   uint32_t *incarnation)
 {
 bool_t enable_tsc_scaling = has_hvm_container_domain(d) &&
-cpu_has_tsc_ratio && !d->arch.vtsc;
+hvm_tsc_scaling_supported && !d->arch.vtsc;
 
 *incarnation = d->arch.incarnation;
 *tsc_mode = d->arch.tsc_mode;
@@ -1865,7 +1864,7 @@ void tsc_set_info(struct domain *d,
  */
 if ( tsc_mode == TSC_MODE_DEFAULT && host_tsc_is_safe() &&
  (has_hvm_container_domain(d) ?
-  d->arch.tsc_khz == cpu_khz || cpu_has_tsc_ratio :
+  d->arch.tsc_khz == cpu_khz || hvm_tsc_scaling_supported :
   incarnation == 0) )
 {
 case TSC_MODE_NEVER_EMULATE:
@@ -1879,7 +1878,7 @@ void tsc_set_info(struct domain *d,
 d->arch.vtsc = !boot_cpu_has(X86_FEATURE_RDTSCP) ||
!host_tsc_is_safe();
 enable_tsc_scaling = has_hvm_container_domain(d) &&
- cpu_has_tsc_ratio && !d->arch.vtsc;
+ hvm_tsc_scaling_supported && !d->arch.vtsc;
 d->arch.tsc_khz = (enable_tsc_scaling && gtsc_khz) ? gtsc_khz :