KVM: PIT: fix injection logic and count
authorMarcelo Tosatti <mtosatti@redhat.com>
Sat, 26 Jul 2008 20:01:01 +0000 (17:01 -0300)
committerAvi Kivity <avi@qumranet.com>
Wed, 15 Oct 2008 08:15:17 +0000 (10:15 +0200)
commit3cf57fed216e2c1b6fdfeccb792650bab72a350a
tree5a557f5870f5fccfbdee3bd61cab5a15e6cdc012
parentf52447261bc8c21dfd4635196e32d2da1352f589
KVM: PIT: fix injection logic and count

The PIT injection logic is problematic under the following cases:

1) If there is a higher priority vector to be delivered by the time
kvm_pit_timer_intr_post is invoked ps->inject_pending won't be set.
This opens the possibility for missing many PIT event injections (say if
guest executes hlt at this point).

2) ps->inject_pending is racy with more than two vcpus. Since there's no locking
around read/dec of pt->pending, two vcpu's can inject two interrupts for a single
pt->pending count.

Fix 1 by using an irq ack notifier: only reinject when the previous irq
has been acked. Fix 2 with appropriate locking around manipulation of
pending count and irq_ack by the injection / ack paths.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
arch/x86/kvm/i8254.c
arch/x86/kvm/i8254.h
arch/x86/kvm/irq.c