repository: /home/avi/kvm/linux-2.6
branch: (no branch)
commit 3d2f1d316341206f96027a2b4fb148c0ac2677f8
Author: Avi Kivity <[EMAIL PROTECTED]>
Date:   Tue Sep 18 14:19:00 2007 +0200

    KVM: Fix ioapic level-triggered interrupt redelivery
    
    The ioapic failed to set the irr bit if a previous interrupt was already
    being serviced.  This caused interrupt loss fairly soon, leading to loss
    of level-triggered devices like pic networking.
    
    This patch fixes the problem by always setting irr when an irq is asserted.
    
    Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/drivers/kvm/ioapic.c b/drivers/kvm/ioapic.c
index 3ee13c3..b8c7da4 100644
--- a/drivers/kvm/ioapic.c
+++ b/drivers/kvm/ioapic.c
@@ -243,17 +243,10 @@ void kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int 
irq, int level)
                entry = ioapic->redirtbl[irq];
                if (!level)
                        ioapic->irr &= ~mask;
-               if (entry.fields.trig_mode) {   /* level triggered */
-                       if (level && !entry.fields.remote_irr) {
-                               ioapic->irr |= mask;
-                               ioapic_service(ioapic, irq);
-                       }
-               } else if (level && !(ioapic->irr & mask)) {
-                       /*
-                        * edge triggered
-                        */
+               else {
                        ioapic->irr |= mask;
-                       ioapic_service(ioapic, irq);
+                       if (!entry.fields.trig_mode || !entry.fields.remote_irr)
+                               ioapic_service(ioapic, irq);
                }
        }
 }
@@ -285,18 +278,8 @@ void kvm_ioapic_update_eoi(struct kvm *kvm, int vector)
        ASSERT(ent->fields.trig_mode == IOAPIC_LEVEL_TRIG);
 
        ent->fields.remote_irr = 0;
-       /*
-        * TODO:
-        * qemu ioapic doesn't re-deliver level
-        * triggered irq at the time of APIC EOI.
-        * Adding back following code sme time causes RHEL5U
-        * guest boot no progress at ethernet bringup, so
-        * leave it same with qemu for now and revisit later.
-        */
-/*
        if (!ent->fields.mask && (ioapic->irr & (1 << gsi)))
                ioapic_deliver(ioapic, gsi);
-*/
 }
 
 static int ioapic_in_range(struct kvm_io_device *this, gpa_t addr)

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
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