um: irqs: allow invoking time-travel handler multiple times
authorJohannes Berg <johannes.berg@intel.com>
Fri, 5 Mar 2021 12:19:57 +0000 (13:19 +0100)
committerRichard Weinberger <richard@nod.at>
Thu, 17 Jun 2021 19:44:52 +0000 (21:44 +0200)
If we happen to get multiple messages while IRQS are already
suspended, we still need to handle them, since otherwise the
simulation blocks.

Remove the "prevent nesting" part, time_travel_add_irq_event()
will deal with being called multiple times just fine.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/kernel/irq.c

index 1c448ea..f3f19da 100644 (file)
@@ -101,10 +101,12 @@ static bool irq_do_timetravel_handler(struct irq_entry *entry,
        if (!reg->timetravel_handler)
                return false;
 
-       /* prevent nesting - we'll get it again later when we SIGIO ourselves */
-       if (reg->pending_on_resume)
-               return true;
-
+       /*
+        * Handle all messages - we might get multiple even while
+        * interrupts are already suspended, due to suspend order
+        * etc. Note that time_travel_add_irq_event() will not add
+        * an event twice, if it's pending already "first wins".
+        */
        reg->timetravel_handler(reg->irq, entry->fd, reg->id, &reg->event);
 
        if (!reg->event.pending)