]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
On pirq enable/disable we fully unregister/reregister with Xen. This
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 21 Nov 2007 09:41:11 +0000 (09:41 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 21 Nov 2007 09:41:11 +0000 (09:41 +0000)
causes the underlying IRQ to be properly masked/unmasked, thus
avoiding deadlock scenarios if the IRQ is not EOIed.
Based on a patch by Chris Lalancette <clalance@redhat.com>
Signed-off-by: Keir Fraser <keir.fraser@eu.citrix.com>
drivers/xen/core/evtchn.c

index 6e83ca2d219b5648c78a3d6a136c94d56c271026..1b777c5676015446c60bda4c499c039ea7a44c5b 100644 (file)
@@ -782,20 +782,11 @@ static void shutdown_pirq(unsigned int irq)
 
 static void enable_pirq(unsigned int irq)
 {
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn)) {
-               unmask_evtchn(evtchn);
-               pirq_unmask_notify(irq_to_pirq(irq));
-       }
+       startup_pirq(irq);
 }
 
 static void disable_pirq(unsigned int irq)
 {
-       int evtchn = evtchn_from_irq(irq);
-
-       if (VALID_EVTCHN(evtchn))
-               mask_evtchn(evtchn);
 }
 
 static void ack_pirq(unsigned int irq)
@@ -814,7 +805,10 @@ static void end_pirq(unsigned int irq)
 {
        int evtchn = evtchn_from_irq(irq);
 
-       if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED)) {
+       if ((irq_desc[irq].status & (IRQ_DISABLED|IRQ_PENDING)) ==
+           (IRQ_DISABLED|IRQ_PENDING)) {
+               shutdown_pirq(irq);
+       } else if (VALID_EVTCHN(evtchn)) {
                unmask_evtchn(evtchn);
                pirq_unmask_notify(irq_to_pirq(irq));
        }