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 <avi@qumranet.com>
This commit is contained in:
Родитель
0b975a3c2d
Коммит
8c35f237fb
|
@ -211,6 +211,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq)
|
||||||
case IOAPIC_LOWEST_PRIORITY:
|
case IOAPIC_LOWEST_PRIORITY:
|
||||||
vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector,
|
vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector,
|
||||||
deliver_bitmask);
|
deliver_bitmask);
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
if (irq == 0)
|
||||||
|
vcpu = ioapic->kvm->vcpus[0];
|
||||||
|
#endif
|
||||||
if (vcpu != NULL)
|
if (vcpu != NULL)
|
||||||
ioapic_inj_irq(ioapic, vcpu, vector,
|
ioapic_inj_irq(ioapic, vcpu, vector,
|
||||||
trig_mode, delivery_mode);
|
trig_mode, delivery_mode);
|
||||||
|
@ -220,6 +224,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq)
|
||||||
deliver_bitmask, vector, IOAPIC_LOWEST_PRIORITY);
|
deliver_bitmask, vector, IOAPIC_LOWEST_PRIORITY);
|
||||||
break;
|
break;
|
||||||
case IOAPIC_FIXED:
|
case IOAPIC_FIXED:
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
if (irq == 0)
|
||||||
|
deliver_bitmask = 1;
|
||||||
|
#endif
|
||||||
for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) {
|
for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) {
|
||||||
if (!(deliver_bitmask & (1 << vcpu_id)))
|
if (!(deliver_bitmask & (1 << vcpu_id)))
|
||||||
continue;
|
continue;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче