From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Guthro Subject: [PATCH] LAPIC timer accounting fix Date: Wed, 24 Oct 2007 17:12:55 -0400 Message-ID: <471FB557.9070406@virtualiron.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------020706010200020803040902" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel , Gary Grebus List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------020706010200020803040902 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Offset emulated local APIC timer so it doesn't tick during guest's timer related processing. Otherwise, guests using the local APIC for process accounting can see long sequences of process ticks incorrectly charged to interrupt processing. Signed-off-by: Ben Guthro Signed-off-by: Gary Grebus --------------020706010200020803040902 Content-Type: text/x-patch; name="xen-lapic-timer.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xen-lapic-timer.patch" diff -r 68521d709355 xen/arch/x86/hvm/vlapic.c --- a/xen/arch/x86/hvm/vlapic.c Tue Sep 11 15:33:54 2007 -0400 +++ b/xen/arch/x86/hvm/vlapic.c Tue Sep 11 15:33:54 2007 -0400 @@ -962,6 +962,11 @@ void vlapic_destroy(struct vcpu *v) free_domheap_page(vlapic->regs_page); } +int is_lvtt_vector(struct vcpu *v, int vector) +{ + return (vector == vlapic_lvt_vector(vcpu_vlapic(v), APIC_LVTT)); +} + int is_lvtt(struct vcpu *v, int vector) { return vcpu_vlapic(v)->pt.enabled && diff -r 68521d709355 xen/arch/x86/hvm/vpt.c --- a/xen/arch/x86/hvm/vpt.c Tue Sep 11 15:33:54 2007 -0400 +++ b/xen/arch/x86/hvm/vpt.c Tue Sep 11 15:33:54 2007 -0400 @@ -277,6 +277,13 @@ void create_periodic_time( pt->period_cycles = (u64)period * cpu_khz / 1000000L; pt->one_shot = one_shot; pt->scheduled = NOW() + period; + if (is_lvtt_vector(v, irq)) + { + /* Try to offset local APIC ticks from timer ticks. Otherwise, guests + using the local APIC for process accounting can see long sequences + of process ticks incorrectly charged to interrupt processing. */ + pt->scheduled += (period >> 1); + } pt->cb = cb; pt->priv = data; diff -r 68521d709355 xen/include/asm-x86/hvm/vlapic.h --- a/xen/include/asm-x86/hvm/vlapic.h Tue Sep 11 15:33:54 2007 -0400 +++ b/xen/include/asm-x86/hvm/vlapic.h Tue Sep 11 15:33:54 2007 -0400 @@ -92,6 +92,7 @@ struct vlapic *apic_round_robin( int vlapic_match_logical_addr(struct vlapic *vlapic, uint8_t mda); +int is_lvtt_vector(struct vcpu *v, int vector); int is_lvtt(struct vcpu *v, int vector); int is_lvtt_enabled(struct vcpu *v); --------------020706010200020803040902 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.xensource.com http://lists.xensource.com/xen-devel --------------020706010200020803040902--