From da29b4367149e0fd164bf5de7919167937095e67 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 25 Feb 2008 10:28:31 +0200 Subject: [PATCH] KVM: Route irq 0 to vcpu 0 exclusively 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 --- virt/kvm/ioapic.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 317f8e211cd2a..4232fd75dd20b 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; -- 2.39.5