diff options
author | Avi Kivity <avi@qumranet.com> | 2007-09-21 05:29:13 +0200 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2007-09-21 05:29:13 +0200 |
commit | 99f6c824362215f3038cfe54ddcd3c940281e9cd (patch) | |
tree | fc9d77d90c137b64631147273bb1138148fe9674 | |
parent | 5fdd2a196e7975d446fedf6973cbb20708f1359c (diff) |
KVM: Fix ioapic edge-triggered interruptskvm-43
- clear irr after service
- do not service after unmasking; wait for a new edge
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r-- | drivers/kvm/ioapic.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/kvm/ioapic.c b/drivers/kvm/ioapic.c index b0d3843b7963..9eb505861475 100644 --- a/drivers/kvm/ioapic.c +++ b/drivers/kvm/ioapic.c @@ -90,6 +90,8 @@ static void ioapic_service(struct kvm_ioapic *ioapic, unsigned int idx) if (pent->fields.trig_mode == IOAPIC_LEVEL_TRIG) pent->fields.remote_irr = 1; } + if (!pent->fields.trig_mode) + ioapic->irr &= ~(1 << idx); } static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) @@ -121,7 +123,8 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) ioapic->redirtbl[index].bits |= (u32) val; ioapic->redirtbl[index].fields.remote_irr = 0; } - ioapic_service(ioapic, index); + if (ioapic->irr & (1 << index)) + ioapic_service(ioapic, index); break; } } |