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);