KVM: PIT: make last_injected_time per-guest
Otherwise multiple guests use the same variable and boom.
Also use kvm_vcpu_kick() to make sure that if a timer triggers on a different CPU the event won't be missed.
Signed-off-by Marcelo Tosatti <[email protected]>
Tested-and-Acked-by Alex Davis <[email protected]>
arch/x86/kvm/i8254.c +4 -7
@@ -200,10 +200,8 @@ int __pit_timer_fn(struct kvm_kpit_state *ps)atomic_inc (&pt->pending);smp_mb__after_atomic_inc (); -if (vcpu0 &&waitqueue_active (&vcpu0->wq)) { - vcpu0->arch.mp_state =KVM_MP_STATE_RUNNABLE ; -wake_up_interruptible (&vcpu0->wq); - } +if (vcpu0) +kvm_vcpu_kick (vcpu0); pt->timer.expires =ktime_add_ns (pt->timer.expires, pt->period); pt->scheduled =ktime_to_ns (pt->timer.expires);
@@ -572,7 +570,6 @@ void kvm_inject_pit_timer_irqs(struct kvm_vcpu *vcpu)struct kvm_pit *pit = vcpu->kvm->arch.vpit;struct kvm *kvm = vcpu->kvm;struct kvm_kpit_state *ps; -static unsigned long last_injected_time;if (vcpu && pit) { ps = &pit->pit_state;
@@ -582,11 +579,11 @@ void kvm_inject_pit_timer_irqs(struct kvm_vcpu *vcpu)* 2. Last interrupt was accepted or waited for too long time*/ if (atomic_read (&ps->pit_timer.pending) && (ps->inject_pending || - (jiffies - last_injected_time + (jiffies - ps->last_injected_time >=KVM_MAX_PIT_INTR_INTERVAL ))) { ps->inject_pending =0 ;__inject_pit_timer_intr (kvm); - last_injected_time = jiffies; + ps->last_injected_time = jiffies; } } }
arch/x86/kvm/i8254.h +1 -0
@@ -35,6 +35,7 @@ struct kvm_kpit_state {struct mutex lock;struct kvm_pit *pit;bool inject_pending;/* if inject pending interrupts */ +unsigned long last_injected_time; };struct kvm_pit {
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
Avi Kivity
AppliedQuoted 6 lines · Marcelo Tosatti
Otherwise multiple guests use the same variable and boom.
Also use
kvm_vcpu_kick()to make sure that if a timer triggers on a different CPU the event won't be missed.
Applied, thanks.
Signature · 8 lines
error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone