[HVM][PIT] Fix missed_ticks() logic.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 7 Jun 2006 12:42:21 +0000 (13:42 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 7 Jun 2006 12:42:21 +0000 (13:42 +0100)
Signed-off-by Xiaowei Yang <xiaowei.yang@intel.com>

xen/arch/x86/hvm/intercept.c

index 11884399c28b2680b5fe93b56d765c29117ee951..25a715cdfd76fb7aa570da205b29229676297648 100644 (file)
@@ -216,13 +216,14 @@ void hlt_timer_fn(void *data)
 
 static __inline__ void missed_ticks(struct periodic_time *pt)
 {
-    int missed_ticks;
+    s_time_t missed_ticks;
 
-    missed_ticks = (NOW() - pt->scheduled)/(s_time_t) pt->period;
-    if ( missed_ticks++ >= 0 ) {
+    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;
@@ -237,6 +238,9 @@ void pt_timer_fn(void *data)
     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);
     if ( test_bit(_VCPUF_running, &v->vcpu_flags) ) {