Fix missed_ticks() logic. Signed-off-by Xiaowei Yang diff -r 8aca850f66ad xen/arch/x86/hvm/intercept.c --- a/xen/arch/x86/hvm/intercept.c Mon Jun 5 09:42:40 2006 +++ b/xen/arch/x86/hvm/intercept.c Tue Jun 6 15:51:49 2006 @@ -216,13 +216,14 @@ static __inline__ void missed_ticks(struct periodic_time *pt) { - int missed_ticks; - - missed_ticks = (NOW() - pt->scheduled)/(s_time_t) pt->period; - if ( missed_ticks++ >= 0 ) { + s_time_t missed_ticks; + + missed_ticks = NOW() - pt->scheduled; + if ( missed_ticks > 0 ) { + missed_ticks = missed_ticks / (s_time_t) pt->period + 1; if ( missed_ticks > 1000 ) { /* TODO: Adjust guest time togther */ - pt->pending_intr_nr ++; + pt->pending_intr_nr++; } else { pt->pending_intr_nr += missed_ticks; @@ -236,6 +237,9 @@ { struct vcpu *v = data; struct periodic_time *pt = &(v->domain->arch.hvm_domain.pl_time.periodic_tm); + + pt->pending_intr_nr++; + pt->scheduled += pt->period; /* pick up missed timer tick */ missed_ticks(pt);