aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/vpt.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-11-05 10:09:10 +0000
committerKeir Fraser <keir@xensource.com>2007-11-05 10:09:10 +0000
commit8e801055bf79e1b4dfda51518e70eb629bd9e159 (patch)
treefdb8a36f3a4e9ab13fdb31f24706caa4b6f5fc9f /xen/arch/x86/hvm/vpt.c
parent82f13984fbb85948c0090329ce2133e98d533738 (diff)
downloadxen-8e801055bf79e1b4dfda51518e70eb629bd9e159.tar.gz
xen-8e801055bf79e1b4dfda51518e70eb629bd9e159.tar.bz2
xen-8e801055bf79e1b4dfda51518e70eb629bd9e159.zip
x86, hvm: More fixes to no-missed-tick-accounting mode.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/hvm/vpt.c')
-rw-r--r--xen/arch/x86/hvm/vpt.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
index 49614997df..b1bd111f19 100644
--- a/xen/arch/x86/hvm/vpt.c
+++ b/xen/arch/x86/hvm/vpt.c
@@ -47,21 +47,26 @@ static void pt_unlock(struct periodic_time *pt)
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;
+ s_time_t missed_ticks, now = NOW();
if ( pt->one_shot )
return;
- missed_ticks = NOW() - pt->scheduled;
+ missed_ticks = now - pt->scheduled;
if ( missed_ticks <= 0 )
return;
- missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
- pt->pending_intr_nr += missed_ticks;
- pt->scheduled += missed_ticks * pt->period;
+ if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
+ {
+ pt->pending_intr_nr = 1;
+ pt->scheduled = now + pt->scheduled;
+ }
+ else
+ {
+ missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
+ pt->pending_intr_nr += missed_ticks;
+ pt->scheduled += missed_ticks * pt->period;
+ }
}
static void pt_freeze_time(struct vcpu *v)