While generally the PIT is used to signal only the BSP,
it's doesn't actually have to do that architecturally.
Allow the PIC to signal any VCPU that is in
Virtual Wire mode.

Signed-off-by: Chris Lalancette <clala...@redhat.com>
---
 arch/x86/kvm/i8259.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 80d4705..ff20415 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -242,8 +242,6 @@ int kvm_pic_read_irq(struct kvm *kvm)
 static void kvm_pic_reset(struct kvm_kpic_state *s)
 {
        int irq;
-       struct kvm *kvm = s->pics_state->irq_request_opaque;
-       struct kvm_vcpu *vcpu0 = kvm->bsp_vcpu;
        u8 irr = s->irr, isr = s->imr;
 
        s->last_irr = 0;
@@ -263,10 +261,8 @@ static void kvm_pic_reset(struct kvm_kpic_state *s)
        s->init4 = 0;
 
        for (irq = 0; irq < PIC_NUM_PINS/2; irq++) {
-               if (vcpu0 && kvm_apic_in_virtual_wire_mode(vcpu0))
-                       if (irr & (1 << irq) || isr & (1 << irq)) {
-                               pic_clear_isr(s, irq);
-                       }
+               if (irr & (1 << irq) || isr & (1 << irq))
+                       pic_clear_isr(s, irq);
        }
 }
 
@@ -506,14 +502,19 @@ static int picdev_read(struct kvm_io_device *this,
 static void pic_irq_request(void *opaque, int level)
 {
        struct kvm *kvm = opaque;
-       struct kvm_vcpu *vcpu = kvm->bsp_vcpu;
        struct kvm_pic *s = pic_irqchip(kvm);
        int irq = pic_get_irq(&s->pics[0]);
+       struct kvm_vcpu *vcpu;
+       int i;
 
        s->output = level;
-       if (vcpu && level && (s->pics[0].isr_ack & (1 << irq))) {
+       if (level && (s->pics[0].isr_ack & (1 << irq))) {
                s->pics[0].isr_ack &= ~(1 << irq);
-               kvm_vcpu_kick(vcpu);
+               kvm_for_each_vcpu(i, vcpu, kvm) {
+                       if (kvm_apic_in_virtual_wire_mode(vcpu) &&
+                           waitqueue_active(&vcpu->wq))
+                               wake_up_interruptible(&vcpu->wq);
+               }
        }
 }
 
-- 
1.6.5.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to