# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 5a4517468f4f7341eef9d20d4959187a7f2f2267
# Parent 2d20b54322535f8d64696e3b7f0feaf2207a244b
[HVM] Remove HVM halt timer. It's no longer needed since interrupts
can wake it up now.
Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 14 --------------
xen/arch/x86/hvm/intercept.c | 18 +++++++-----------
xen/arch/x86/hvm/svm/svm.c | 9 +++++----
xen/arch/x86/hvm/vlapic.c | 2 ++
xen/arch/x86/hvm/vmx/vmx.c | 9 +++++----
xen/include/asm-x86/hvm/vcpu.h | 3 ---
6 files changed, 19 insertions(+), 36 deletions(-)
diff -r 2d20b5432253 -r 5a4517468f4f xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/arch/x86/hvm/hvm.c Fri Nov 10 11:01:15 2006 +0000
@@ -176,8 +176,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
get_vio(v->domain, v->vcpu_id)->vp_eport =
v->arch.hvm_vcpu.xen_port;
- init_timer(&v->arch.hvm_vcpu.hlt_timer, hlt_timer_fn, v, v->processor);
-
if ( v->vcpu_id != 0 )
return 0;
@@ -198,7 +196,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
void hvm_vcpu_destroy(struct vcpu *v)
{
- kill_timer(&v->arch.hvm_vcpu.hlt_timer);
vlapic_destroy(v);
hvm_funcs.vcpu_destroy(v);
@@ -272,10 +269,6 @@ static void hvm_vcpu_down(void)
void hvm_hlt(unsigned long rflags)
{
- struct vcpu *v = current;
- struct periodic_time *pt = &v->domain->arch.hvm_domain.pl_time.periodic_tm;
- s_time_t next_pt = -1, next_wakeup;
-
/*
* If we halt with interrupts disabled, that's a pretty sure sign that we
* want to shut down. In a real processor, NMIs are the only way to break
@@ -284,13 +277,6 @@ void hvm_hlt(unsigned long rflags)
if ( unlikely(!(rflags & X86_EFLAGS_IF)) )
return hvm_vcpu_down();
- if ( !v->vcpu_id )
- next_pt = get_scheduled(v, pt->irq, pt);
- next_wakeup = get_apictime_scheduled(v);
- if ( (next_pt != -1 && next_pt < next_wakeup) || next_wakeup == -1 )
- next_wakeup = next_pt;
- if ( next_wakeup != - 1 )
- set_timer(¤t->arch.hvm_vcpu.hlt_timer, next_wakeup);
do_sched_op_compat(SCHEDOP_block, 0);
}
diff -r 2d20b5432253 -r 5a4517468f4f xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/arch/x86/hvm/intercept.c Fri Nov 10 11:01:15 2006 +0000
@@ -268,13 +268,6 @@ int register_io_handler(
return 1;
}
-/* Hook function for the HLT instruction emulation wakeup. */
-void hlt_timer_fn(void *data)
-{
- struct vcpu *v = data;
- vcpu_kick(v);
-}
-
static __inline__ void missed_ticks(struct periodic_time *pt)
{
s_time_t missed_ticks;
@@ -297,16 +290,19 @@ void pt_timer_fn(void *data)
void pt_timer_fn(void *data)
{
struct vcpu *v = data;
- struct periodic_time *pt =
&(v->domain->arch.hvm_domain.pl_time.periodic_tm);
+ 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 */
+ /* Pick up missed timer ticks. */
missed_ticks(pt);
- if ( test_bit(_VCPUF_running, &v->vcpu_flags) ) {
+
+ /* No need to run the timer while a VCPU is descheduled. */
+ if ( test_bit(_VCPUF_running, &v->vcpu_flags) )
set_timer(&pt->timer, pt->scheduled);
- }
+
+ vcpu_kick(v);
}
/* pick up missed timer ticks at deactive time */
diff -r 2d20b5432253 -r 5a4517468f4f xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/arch/x86/hvm/svm/svm.c Fri Nov 10 11:01:15 2006 +0000
@@ -712,11 +712,13 @@ static void svm_freeze_time(struct vcpu
static void svm_freeze_time(struct vcpu *v)
{
struct periodic_time *pt=&v->domain->arch.hvm_domain.pl_time.periodic_tm;
-
- if ( pt->enabled && pt->first_injected && v->vcpu_id == pt->bind_vcpu
+
+ if ( pt->enabled && pt->first_injected
+ && (v->vcpu_id == pt->bind_vcpu)
&& !v->arch.hvm_vcpu.guest_time ) {
v->arch.hvm_vcpu.guest_time = hvm_get_guest_time(v);
- stop_timer(&(pt->timer));
+ if ( test_bit(_VCPUF_blocked, &v->vcpu_flags) )
+ stop_timer(&pt->timer);
}
}
@@ -853,7 +855,6 @@ static void svm_migrate_timers(struct vc
if ( pt->enabled )
{
migrate_timer(&pt->timer, v->processor);
- migrate_timer(&v->arch.hvm_vcpu.hlt_timer, v->processor);
}
migrate_timer(&vcpu_vlapic(v)->vlapic_timer, v->processor);
migrate_timer(&vrtc->second_timer, v->processor);
diff -r 2d20b5432253 -r 5a4517468f4f xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/arch/x86/hvm/vlapic.c Fri Nov 10 11:01:15 2006 +0000
@@ -835,6 +835,8 @@ void vlapic_timer_fn(void *data)
else
vlapic_set_reg(vlapic, APIC_TMCCT, 0);
+ vcpu_kick(vlapic_vcpu(vlapic));
+
HVM_DBG_LOG(DBG_LEVEL_VLAPIC_TIMER,
"now 0x%016"PRIx64", expire @ 0x%016"PRIx64", "
"timer initial count 0x%x, timer current count 0x%x.",
diff -r 2d20b5432253 -r 5a4517468f4f xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c Fri Nov 10 11:01:15 2006 +0000
@@ -368,11 +368,13 @@ static void vmx_freeze_time(struct vcpu
static void vmx_freeze_time(struct vcpu *v)
{
struct periodic_time *pt=&v->domain->arch.hvm_domain.pl_time.periodic_tm;
-
- if ( pt->enabled && pt->first_injected && v->vcpu_id == pt->bind_vcpu
+
+ if ( pt->enabled && pt->first_injected
+ && (v->vcpu_id == pt->bind_vcpu)
&& !v->arch.hvm_vcpu.guest_time ) {
v->arch.hvm_vcpu.guest_time = hvm_get_guest_time(v);
- stop_timer(&(pt->timer));
+ if ( !test_bit(_VCPUF_blocked, &v->vcpu_flags) )
+ stop_timer(&pt->timer);
}
}
@@ -407,7 +409,6 @@ void vmx_migrate_timers(struct vcpu *v)
if ( pt->enabled )
{
migrate_timer(&pt->timer, v->processor);
- migrate_timer(&v->arch.hvm_vcpu.hlt_timer, v->processor);
}
migrate_timer(&vcpu_vlapic(v)->vlapic_timer, v->processor);
migrate_timer(&vrtc->second_timer, v->processor);
diff -r 2d20b5432253 -r 5a4517468f4f xen/include/asm-x86/hvm/vcpu.h
--- a/xen/include/asm-x86/hvm/vcpu.h Fri Nov 10 10:31:29 2006 +0000
+++ b/xen/include/asm-x86/hvm/vcpu.h Fri Nov 10 11:01:15 2006 +0000
@@ -44,9 +44,6 @@ struct hvm_vcpu {
/* Flags */
int flag_dr_dirty;
- /* hlt ins emulation wakeup timer */
- struct timer hlt_timer;
-
unsigned long hvm_trace_values[5];
union {
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|