diff -r 650cadd1b283 xen/arch/x86/hvm/vpt.c --- a/xen/arch/x86/hvm/vpt.c Fri Nov 02 16:38:11 2007 +0000 +++ b/xen/arch/x86/hvm/vpt.c Sat Nov 03 16:20:04 2007 -0400 @@ -45,12 +45,20 @@ static void pt_unlock(struct periodic_ti spin_unlock(&pt->vcpu->arch.hvm_vcpu.tm_lock); } +#define PT_SCHEDULE_SYNC 0 +#define PT_SCHEDULE_ASYNC 1 +int pt_missed_option = PT_SCHEDULE_SYNC; static void pt_process_missed_ticks(struct periodic_time *pt) { s_time_t missed_ticks; - if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) ) - return; + if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) && (pt_missed_option == PT_SCHEDULE_ASYNC)) { + if ( pt->one_shot ) + return; + if ( (NOW() - pt->scheduled) >= 0 ) + pt->scheduled = NOW() + pt->period; + return; + } if ( pt->one_shot ) return; @@ -60,7 +68,8 @@ static void pt_process_missed_ticks(stru return; missed_ticks = missed_ticks / (s_time_t) pt->period + 1; - pt->pending_intr_nr += missed_ticks; + if ( !mode_is(pt->vcpu->domain, no_missed_tick_accounting) ) + pt->pending_intr_nr += missed_ticks; pt->scheduled += missed_ticks * pt->period; }