[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 04/10] x86/hvm: Collect information of TSC scaling ratio
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 <haozhong.zhang@xxxxxxxxx> > Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > --- > 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, &svm_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 <asm/hpet.h> > #include <io_ports.h> > #include <asm/setup.h> /* for early_time_init */ > -#include <asm/hvm/svm/svm.h> /* for cpu_has_tsc_ratio */ > #include <public/arch-x86/cpuid.h> > > /* 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 long-standing issue, no blocker to this patch. > { > 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 : > cpu_khz; > set_time_scale(&d->arch.vtsc_to_ns, d->arch.tsc_khz * 1000 ); > d->arch.ns_to_vtsc = scale_reciprocal(d->arch.vtsc_to_ns); > diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h > index a87224b..79ea59e 100644 > --- a/xen/include/asm-x86/hvm/hvm.h > +++ b/xen/include/asm-x86/hvm/hvm.h > @@ -100,6 +100,17 @@ struct hvm_function_table { > unsigned int hap_capabilities; > > /* > + * Parameters of hardware-assisted TSC scaling, which are valid only when > + * the hardware feature is available. > + */ > + /* number of bits of the fractional part of TSC scaling ratio */ > + uint8_t tsc_scaling_ratio_frac_bits; > + /* default TSC scaling ratio (no scaling) */ > + uint64_t default_tsc_scaling_ratio; > + /* maximum-allowed TSC scaling ratio */ > + uint64_t max_tsc_scaling_ratio; > + > + /* > * Initialise/destroy HVM domain/vcpu resources > */ > int (*domain_initialise)(struct domain *d); > @@ -213,6 +224,7 @@ struct hvm_function_table { > bool_t (*altp2m_vcpu_emulate_ve)(struct vcpu *v); > int (*altp2m_vcpu_emulate_vmfunc)(struct cpu_user_regs *regs); > > + /* Valid only when hardware-assisted TSC scaling is available */ > uint64_t (*scale_tsc)(const struct vcpu *v, uint64_t tsc); > }; > > @@ -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) > + > int hvm_set_mode(struct vcpu *v, int mode); > void hvm_init_guest_time(struct domain *d); > void hvm_set_guest_time(struct vcpu *v, u64 guest_time); > Amazon Development Center Germany GmbH Berlin - Dresden - Aachen main office: Krausenstr. 38, 10117 Berlin Geschaeftsfuehrer: Dr. Ralf Herbrich, Christian Schlaeger Ust-ID: DE289237879 Eingetragen am Amtsgericht Charlottenburg HRB 149173 B _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |