rendez: Use a regular alarm instead of an IRQ alarm
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 2 Nov 2018 01:27:14 +0000 (21:27 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 2 Nov 2018 01:51:48 +0000 (21:51 -0400)
This was the only user of IRQ alarms.  To resolve some issues with
alarms, it'd be easier to not have IRQ alarms at all.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/rendez.c

index 78ac004..4313c9a 100644 (file)
@@ -54,8 +54,7 @@ void rendez_sleep(struct rendez *rv, int (*cond)(void*), void *arg)
 /* Force a wakeup of all waiters on the rv, including non-timeout users.  For
  * those, they will just wake up, see the condition is still false (probably)
  * and go back to sleep. */
-static void rendez_alarm_handler(struct alarm_waiter *awaiter,
-                                 struct hw_trapframe *hw_tf)
+static void rendez_alarm_handler(struct alarm_waiter *awaiter)
 {
        struct rendez *rv = (struct rendez*)awaiter->data;
 
@@ -83,10 +82,9 @@ void rendez_sleep_timeout(struct rendez *rv, int (*cond)(void*), void *arg,
        }
        cv_unlock_irqsave(&rv->cv, &irq_state);
        /* The handler will call rendez_wake, but won't mess with the condition
-        * state.  It's enough to break us out of cv_wait() to see .on_tchain.
-        * Since all we're doing is poking a rendez, we might as well just do it
-        * from IRQ ctx instead of mucking with an extra RKM. */
-       init_awaiter_irq(&awaiter, rendez_alarm_handler);
+        * state.  It's enough to break us out of cv_wait() to see .on_tchain is
+        * clear, which is a proxy for "has my alarm fired or will it soon." */
+       init_awaiter(&awaiter, rendez_alarm_handler);
        awaiter.data = rv;
        set_awaiter_rel(&awaiter, usec);
        /* Set our alarm on this cpu's tchain.  Note that when we sleep in cv_wait,