[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] x86/viridian: Add partition time reference counter MSR support
This patch optionally re-instates support for the partition time reference counter that was previously introduced by commit e36cd2cdc9674a7a4855d21fb7b3e6e17c4bb33b and reverted by commit 1cd4fab14ce25859efa4a2af13475e6650a5506c. The previous implementation was non-optional and flawed. The counter value used in this implementation properly fulfils the documented semantics of the MSR. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Cc: Keir Fraser <keir@xxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- docs/man/xl.cfg.pod.5 | 23 +++++++++++++++-------- tools/libxl/libxl_dom.c | 2 ++ xen/arch/x86/hvm/viridian.c | 26 +++++++++++++++++++++----- xen/include/asm-x86/perfc_defn.h | 1 + xen/include/public/hvm/params.h | 9 ++++++++- 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index d770114..b1daf4a 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -1098,23 +1098,30 @@ This set incorporates the Hypercall MSRs, Virtual processor index MSR, and APIC access MSRs. This set is a pre-requisite for all other sets. If it is not specified then all enlightenments will be disabled. +These enlightenments can improve performance of Windows Vista and Windows +Server 2008 onwards and setting this option for such guests is strongly +recommended. + =item B<freq> This set incorporates the TSC and APIC frequency MSRs. +This enlightenment can improve performance of Windows 7 and Windows +Server 2008 R2 onwards. + +=item B<time-ref-count> + +This set incorporates Partition Time Reference Counter MSR. + +This enlightenment can improve performance of Windows 8 and Windows +Server 2012 onwards. + =back See the latest version of Microsoft's Hypervisor Top-Level Functional Specification for more details. -This base set of enlightenments can improve performance of Windows Vista -and Windows Server 2008 onwards and setting this option for such guests is -strongly recommended. - -The TSC and APIC frequency MSRs can improve performance of Microsoft -Windows 7 and Server 2008 R2 onwards. - -The enlightenments should be harmless for other versions of Windows +The viridian enlightenments should be harmless for other versions of Windows (although they will not give any benefit) and the majority of other non-Windows OSes. However it is known that they are incompatible with some other Operating diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index a15c185..1ebdecd 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -222,6 +222,8 @@ static void hvm_set_viridian_features(libxl__gc *gc, uint32_t domid, feature_mask |= HVMPV_base_freq; else if (strcmp(*p, "freq") == 0) feature_mask &= ~HVMPV_no_freq; + else if (strcmp(*p, "time-ref-count") == 0) + feature_mask |= HVMPV_time_ref_count; p++; } diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c index 891b21f..f0bfa8f 100644 --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -36,11 +36,11 @@ #define HvNotifyLongSpinWait 8 /* Viridian CPUID 4000003, Viridian MSR availability. */ -#define CPUID3A_MSR_REF_COUNT (1 << 1) -#define CPUID3A_MSR_APIC_ACCESS (1 << 4) -#define CPUID3A_MSR_HYPERCALL (1 << 5) -#define CPUID3A_MSR_VP_INDEX (1 << 6) -#define CPUID3A_MSR_FREQ (1 << 11) +#define CPUID3A_MSR_TIME_REF_COUNT (1 << 1) +#define CPUID3A_MSR_APIC_ACCESS (1 << 4) +#define CPUID3A_MSR_HYPERCALL (1 << 5) +#define CPUID3A_MSR_VP_INDEX (1 << 6) +#define CPUID3A_MSR_FREQ (1 << 11) /* Viridian CPUID 4000004, Implementation Recommendations. */ #define CPUID4A_MSR_BASED_APIC (1 << 3) @@ -93,6 +93,8 @@ int cpuid_viridian_leaves(unsigned int leaf, unsigned int *eax, CPUID3A_MSR_VP_INDEX); if ( ~viridian_feature_mask(d) & HVMPV_no_freq ) *eax |= CPUID3A_MSR_FREQ; + if ( viridian_feature_mask(d) & HVMPV_time_ref_count ) + *eax |= CPUID3A_MSR_TIME_REF_COUNT; break; case 4: /* Recommended hypercall usage. */ @@ -344,6 +346,20 @@ int rdmsr_viridian_regs(uint32_t idx, uint64_t *val) *val = v->arch.hvm_vcpu.viridian.apic_assist.raw; break; + + case VIRIDIAN_MSR_TIME_REF_COUNT: + { + uint64_t sec, nsec; + + if ( ~viridian_feature_mask(d) & HVMPV_time_ref_count ) + return 0; + + perfc_incr(mshv_rdmsr_time_ref_count); + sec = shared_info(d, wc_sec); + nsec = shared_info(d, wc_nsec); + *val = (SECONDS(sec) + nsec + NOW()) / 100ul; + break; + } default: return 0; } diff --git a/xen/include/asm-x86/perfc_defn.h b/xen/include/asm-x86/perfc_defn.h index 7d802cc..170da00 100644 --- a/xen/include/asm-x86/perfc_defn.h +++ b/xen/include/asm-x86/perfc_defn.h @@ -120,6 +120,7 @@ PERFCOUNTER(mshv_rdmsr_hc_page, "MS Hv rdmsr hypercall page") PERFCOUNTER(mshv_rdmsr_vp_index, "MS Hv rdmsr vp index") PERFCOUNTER(mshv_rdmsr_tsc_frequency, "MS Hv rdmsr TSC frequency") PERFCOUNTER(mshv_rdmsr_apic_frequency, "MS Hv rdmsr APIC frequency") +PERFCOUNTER(mshv_rdmsr_time_ref_count, "MS Hv rdmsr time ref count") PERFCOUNTER(mshv_rdmsr_icr, "MS Hv rdmsr icr") PERFCOUNTER(mshv_rdmsr_tpr, "MS Hv rdmsr tpr") PERFCOUNTER(mshv_rdmsr_apic_assist, "MS Hv rdmsr APIC assist") diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 68d26fd..5e27e41 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -88,7 +88,14 @@ #define _HVMPV_no_freq 1 #define HVMPV_no_freq (1 << _HVMPV_no_freq) -#define HVMPV_feature_mask (HVMPV_base_freq|HVMPV_no_freq) +/* Enable Partition Time Reference Counter (HV_X64_MSR_TIME_REF_COUNT) */ +#define _HVMPV_time_ref_count 2 +#define HVMPV_time_ref_count (1 << _HVMPV_time_ref_count) + +#define HVMPV_feature_mask \ + (HVMPV_base_freq| \ + HVMPV_no_freq| \ + HVMPV_time_ref_count) #endif -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |