From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arun Sharma Subject: [PATCH][9/9] Improve guest time keeping Date: Mon, 25 Jul 2005 14:01:59 -0700 Message-ID: <20050725210159.GA24440@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ian Pratt , Keir Fraser Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Improve guest time keeping Even though we accounted for lost ticks, the accounting was not precise. Specifically, we didn't account for the delay in calling the ac_timer handler. Signed-off-by: Eddie Dong Signed-off-by: Arun Sharma diff -r d016dd226b0d -r 83180ee86481 xen/arch/x86/vmx_intercept.c --- a/xen/arch/x86/vmx_intercept.c Mon Jul 18 23:15:02 2005 +++ b/xen/arch/x86/vmx_intercept.c Mon Jul 18 23:47:48 2005 @@ -197,12 +197,23 @@ static void pit_timer_fn(void *data) { struct vmx_virpit_t *vpit = data; + s_time_t next; + int missed_ticks; + + missed_ticks = (NOW() - vpit->scheduled) / MILLISECS(vpit->period); /* Set the pending intr bit, and send evtchn notification to myself. */ if (test_and_set_bit(vpit->vector, vpit->intr_bitmap)) vpit->pending_intr_nr++; /* already set, then count the pending intr */ - set_ac_timer(&vpit->pit_timer, NOW() + MILLISECS(vpit->period)); + /* pick up missed timer tick */ + if ( missed_ticks > 0 ) { + vpit->pending_intr_nr+= missed_ticks; + vpit->scheduled += missed_ticks * MILLISECS(vpit->period); + } + next = vpit->scheduled + MILLISECS(vpit->period); + set_ac_timer(&vpit->pit_timer, next); + vpit->scheduled = next; } @@ -263,7 +274,8 @@ vpit->intr_bitmap = intr; - set_ac_timer(&vpit->pit_timer, NOW() + MILLISECS(vpit->period)); + vpit->scheduled = NOW() + MILLISECS(vpit->period); + set_ac_timer(&vpit->pit_timer, vpit->scheduled); /*restore the state*/ p->state = STATE_IORESP_READY; diff -r d016dd226b0d -r 83180ee86481 xen/include/asm-x86/vmx_virpit.h --- a/xen/include/asm-x86/vmx_virpit.h Mon Jul 18 23:15:02 2005 +++ b/xen/include/asm-x86/vmx_virpit.h Mon Jul 18 23:47:48 2005 @@ -19,6 +19,7 @@ /* for simulation of counter 0 in mode 2*/ int vector; /* the pit irq vector */ unsigned int period; /* the frequency. e.g. 10ms*/ + s_time_t scheduled; /* scheduled timer interrupt */ unsigned int channel; /* the pit channel, counter 0~2 */ u64 *intr_bitmap; unsigned int pending_intr_nr; /* the couner for pending timer interrupts */