From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] x86/HVM: also separate kernel/user vTSC statistics Date: Tue, 10 Feb 2015 11:32:14 +0000 Message-ID: <54D9FA4E020000780005E8FF@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__Part2712A72E.1__=" Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YL93D-00014g-7V for xen-devel@lists.xenproject.org; Tue, 10 Feb 2015 11:32:19 +0000 List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel Cc: Andrew Cooper , Keir Fraser List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__Part2712A72E.1__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline It is unclear why this got done for PV only originally. While at it, limit this statistics collection to debug or performance counter enabled builds. Signed-off-by: Jan Beulich --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -319,7 +319,6 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu=20 { tsc =3D hvm_get_guest_time_fixed(v, at_tsc); tsc =3D gtime_to_gtsc(v->domain, tsc); - v->domain->arch.vtsc_kerncount++; } else if ( at_tsc ) { @@ -4368,12 +4367,41 @@ void hvm_cpuid(unsigned int input, unsig } } =20 +static uint64_t _hvm_rdtsc_intercept(void) +{ + struct vcpu *curr =3D current; +#if !defined(NDEBUG) || defined(PERF_COUNTERS) + struct domain *currd =3D curr->domain; + + if ( currd->arch.vtsc ) + switch ( hvm_guest_x86_mode(curr) ) + { + struct segment_register sreg; + + case 8: + case 4: + case 2: + hvm_get_segment_register(curr, x86_seg_ss, &sreg); + if ( unlikely(sreg.attr.fields.dpl) ) + { + case 1: + currd->arch.vtsc_usercount++; + break; + } + /* fall through */ + case 0: + currd->arch.vtsc_kerncount++; + break; + } +#endif + + return hvm_get_guest_tsc(curr); +} + void hvm_rdtsc_intercept(struct cpu_user_regs *regs) { - uint64_t tsc; - struct vcpu *v =3D current; + uint64_t tsc =3D _hvm_rdtsc_intercept(); =20 - tsc =3D hvm_get_guest_tsc(v); regs->eax =3D (uint32_t)tsc; regs->edx =3D (uint32_t)(tsc >> 32); =20 @@ -4401,7 +4429,7 @@ int hvm_msr_read_intercept(unsigned int=20 break; =20 case MSR_IA32_TSC: - *msr_content =3D hvm_get_guest_tsc(v); + *msr_content =3D _hvm_rdtsc_intercept(); break; =20 case MSR_IA32_TSC_ADJUST: --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -1777,10 +1777,12 @@ void pv_soft_rdtsc(struct vcpu *v, struc =20 spin_lock(&d->arch.vtsc_lock); =20 +#if !defined(NDEBUG) || defined(PERF_COUNTERS) if ( guest_kernel_mode(v, regs) ) d->arch.vtsc_kerncount++; else d->arch.vtsc_usercount++; +#endif =20 if ( (int64_t)(now - d->arch.vtsc_last) > 0 ) d->arch.vtsc_last =3D now; @@ -2033,17 +2035,13 @@ static void dump_softtsc(unsigned char k printk(",khz=3D%"PRIu32, d->arch.tsc_khz); if ( d->arch.incarnation ) printk(",inc=3D%"PRIu32, d->arch.incarnation); +#if !defined(NDEBUG) || defined(PERF_COUNTERS) if ( !(d->arch.vtsc_kerncount | d->arch.vtsc_usercount) ) - { printk("\n"); - continue; - } - if ( is_hvm_domain(d) ) - printk(",vtsc count: %"PRIu64" total\n", - d->arch.vtsc_kerncount); else printk(",vtsc count: %"PRIu64" kernel, %"PRIu64" user\n", d->arch.vtsc_kerncount, d->arch.vtsc_usercount); +#endif domcnt++; } =20 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -319,8 +319,10 @@ struct arch_domain struct time_scale ns_to_vtsc; /* scaling for certain emulated cases = */ uint32_t incarnation; /* incremented every restore or live migrate (possibly other cases in the future */ - uint64_t vtsc_kerncount; /* for hvm, counts all vtsc */ - uint64_t vtsc_usercount; /* not used for hvm */ +#if !defined(NDEBUG) || defined(PERF_COUNTERS) + uint64_t vtsc_kerncount; + uint64_t vtsc_usercount; +#endif =20 /* Pseudophysical e820 map (XENMEM_memory_map). */ spinlock_t e820_lock; --=__Part2712A72E.1__= Content-Type: text/plain; name="x86-HVM-vTSC-counts.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="x86-HVM-vTSC-counts.patch" x86/HVM: also separate kernel/user vTSC statistics=0A=0AIt is unclear why = this got done for PV only originally.=0A=0AWhile at it, limit this = statistics collection to debug or performance=0Acounter enabled builds.=0A= =0ASigned-off-by: Jan Beulich =0A=0A--- a/xen/arch/x86/h= vm/hvm.c=0A+++ b/xen/arch/x86/hvm/hvm.c=0A@@ -319,7 +319,6 @@ u64 = hvm_get_guest_tsc_fixed(struct vcpu =0A {=0A tsc =3D hvm_get_gu= est_time_fixed(v, at_tsc);=0A tsc =3D gtime_to_gtsc(v->domain, = tsc);=0A- v->domain->arch.vtsc_kerncount++;=0A }=0A else if = ( at_tsc )=0A {=0A@@ -4368,12 +4367,41 @@ void hvm_cpuid(unsigned int = input, unsig=0A }=0A }=0A =0A+static uint64_t _hvm_rdtsc_intercept(void= )=0A+{=0A+ struct vcpu *curr =3D current;=0A+#if !defined(NDEBUG) || = defined(PERF_COUNTERS)=0A+ struct domain *currd =3D curr->domain;=0A+=0A= + if ( currd->arch.vtsc )=0A+ switch ( hvm_guest_x86_mode(curr) = )=0A+ {=0A+ struct segment_register sreg;=0A+=0A+ = case 8:=0A+ case 4:=0A+ case 2:=0A+ hvm_get_segmen= t_register(curr, x86_seg_ss, &sreg);=0A+ if ( unlikely(sreg.attr= .fields.dpl) )=0A+ {=0A+ case 1:=0A+ = currd->arch.vtsc_usercount++;=0A+ break;=0A+ = }=0A+ /* fall through */=0A+ case 0:=0A+ = currd->arch.vtsc_kerncount++;=0A+ break;=0A+ }=0A+#endif= =0A+=0A+ return hvm_get_guest_tsc(curr);=0A+}=0A+=0A void hvm_rdtsc_inte= rcept(struct cpu_user_regs *regs)=0A {=0A- uint64_t tsc;=0A- struct = vcpu *v =3D current;=0A+ uint64_t tsc =3D _hvm_rdtsc_intercept();=0A = =0A- tsc =3D hvm_get_guest_tsc(v);=0A regs->eax =3D (uint32_t)tsc;= =0A regs->edx =3D (uint32_t)(tsc >> 32);=0A =0A@@ -4401,7 +4429,7 @@ = int hvm_msr_read_intercept(unsigned int =0A break;=0A =0A case = MSR_IA32_TSC:=0A- *msr_content =3D hvm_get_guest_tsc(v);=0A+ = *msr_content =3D _hvm_rdtsc_intercept();=0A break;=0A =0A case = MSR_IA32_TSC_ADJUST:=0A--- a/xen/arch/x86/time.c=0A+++ b/xen/arch/x86/time.= c=0A@@ -1777,10 +1777,12 @@ void pv_soft_rdtsc(struct vcpu *v, struc=0A = =0A spin_lock(&d->arch.vtsc_lock);=0A =0A+#if !defined(NDEBUG) || = defined(PERF_COUNTERS)=0A if ( guest_kernel_mode(v, regs) )=0A = d->arch.vtsc_kerncount++;=0A else=0A d->arch.vtsc_usercount++;= =0A+#endif=0A =0A if ( (int64_t)(now - d->arch.vtsc_last) > 0 )=0A = d->arch.vtsc_last =3D now;=0A@@ -2033,17 +2035,13 @@ static void = dump_softtsc(unsigned char k=0A printk(",khz=3D%"PRIu32, = d->arch.tsc_khz);=0A if ( d->arch.incarnation )=0A = printk(",inc=3D%"PRIu32, d->arch.incarnation);=0A+#if !defined(NDEBUG) || = defined(PERF_COUNTERS)=0A if ( !(d->arch.vtsc_kerncount | = d->arch.vtsc_usercount) )=0A- {=0A printk("\n");=0A- = continue;=0A- }=0A- if ( is_hvm_domain(d) )=0A- = printk(",vtsc count: %"PRIu64" total\n",=0A- = d->arch.vtsc_kerncount);=0A else=0A printk(",vtsc = count: %"PRIu64" kernel, %"PRIu64" user\n",=0A = d->arch.vtsc_kerncount, d->arch.vtsc_usercount);=0A+#endif=0A = domcnt++;=0A }=0A =0A--- a/xen/include/asm-x86/domain.h=0A+++ = b/xen/include/asm-x86/domain.h=0A@@ -319,8 +319,10 @@ struct arch_domain=0A= struct time_scale ns_to_vtsc; /* scaling for certain emulated cases = */=0A uint32_t incarnation; /* incremented every restore or live = migrate=0A (possibly other cases in the = future */=0A- uint64_t vtsc_kerncount; /* for hvm, counts all vtsc = */=0A- uint64_t vtsc_usercount; /* not used for hvm */=0A+#if !defined(N= DEBUG) || defined(PERF_COUNTERS)=0A+ uint64_t vtsc_kerncount;=0A+ = uint64_t vtsc_usercount;=0A+#endif=0A =0A /* Pseudophysical e820 map = (XENMEM_memory_map). */=0A spinlock_t e820_lock;=0A --=__Part2712A72E.1__= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --=__Part2712A72E.1__=--