From: Avi Kivity <[EMAIL PROTECTED]>

Some Linux versions allow the timer interrupt to be processed by more than
one cpu, leading to hangs due to tsc instability.  Work around the issue
by only disaptching the interrupt to vcpu 0.

Problem analyzed (and patch tested) by Sheng Yang.

Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
index 317f8e2..4232fd7 100644
--- a/virt/kvm/ioapic.c
+++ b/virt/kvm/ioapic.c
@@ -211,6 +211,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int 
irq)
        case IOAPIC_LOWEST_PRIORITY:
                vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector,
                                deliver_bitmask);
+#ifdef CONFIG_X86
+               if (irq == 0)
+                       vcpu = ioapic->kvm->vcpus[0];
+#endif
                if (vcpu != NULL)
                        ioapic_inj_irq(ioapic, vcpu, vector,
                                       trig_mode, delivery_mode);
@@ -220,6 +224,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int 
irq)
                                     deliver_bitmask, vector, 
IOAPIC_LOWEST_PRIORITY);
                break;
        case IOAPIC_FIXED:
+#ifdef CONFIG_X86
+               if (irq == 0)
+                       deliver_bitmask = 1;
+#endif
                for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) {
                        if (!(deliver_bitmask & (1 << vcpu_id)))
                                continue;

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-commits mailing list
kvm-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-commits

Reply via email to