xen: make sure retriggered events are set pending
authorJeremy Fitzhardinge <jeremy@goop.org>
Mon, 17 Mar 2008 23:37:19 +0000 (16:37 -0700)
committerIngo Molnar <mingo@elte.hu>
Thu, 24 Apr 2008 21:57:32 +0000 (23:57 +0200)
retrigger_dynirq() was incomplete, and didn't properly set the event
to be pending again.  It doesn't seem to actually get used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/xen/events.c

index 0140981e93c43a9cfb63d31a1aa9271ee472db40..f73b53bd65b76991b0e53015a261a9657ce23a4c 100644 (file)
@@ -601,10 +601,16 @@ static void ack_dynirq(unsigned int irq)
 static int retrigger_dynirq(unsigned int irq)
 {
        int evtchn = evtchn_from_irq(irq);
+       struct shared_info *sh = HYPERVISOR_shared_info;
        int ret = 0;
 
        if (VALID_EVTCHN(evtchn)) {
-               set_evtchn(evtchn);
+               int masked;
+
+               masked = sync_test_and_set_bit(evtchn, sh->evtchn_mask);
+               sync_set_bit(evtchn, sh->evtchn_pending);
+               if (!masked)
+                       unmask_evtchn(evtchn);
                ret = 1;
        }