Remove EVENT_JUSTHANDLEIT (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 12 Aug 2015 16:20:43 +0000 (12:20 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
The existence of ev_handler is a sufficient signal to override the
default ev_q handling.

Technically this is a kernel header change.  Feel free to ignore it.

Documentation/async_events.txt
kern/include/ros/event.h
tests/evq_block.c
user/parlib/event.c

index 6d7b3ec..0bb1854 100644 (file)
@@ -554,9 +554,10 @@ blocking u_threads).
 
 There are a couple ways to handle this.  Ultimately, the application is supposed
 to handle the event.  If it asked for an IPI, it is because something ought to
-be done, which really means running a handler.  If the application sets
-EVENT_THREAD in the ev_q's flags, the 2LS ought to spawn a thread to run the
-ev_q's handler.  If EVENT_JUSTHANDLEIT is set, the vcore will execute the
+be done, which really means running a handler.  We used to support the
+application setting EVENT_THREAD in the ev_q's flags, and the 2LS would spawn a
+thread to run the ev_q's handler.  Now we just have the application block a
+uthread on the evq.  If an ev_handler is set, the vcore will execute the
 handler itself.  Careful with this, since the only memory it touches must be
 pinned, the function must not block (this is only true for the handlers called
 directly out of vcore context), and it should return quickly.
index 86ca929..dee54b0 100644 (file)
@@ -25,9 +25,6 @@
 #define EVENT_VCORE_APPRO              0x00200 /* send to where the kernel wants */
 #define EVENT_WAKEUP                   0x00400 /* wake up the process after sending */
 
-/* Flags from the program to the 2LS */
-#define EVENT_JUSTHANDLEIT             0x10000 /* 2LS should handle the ev_q */
-
 /* Event Message Types */
 #define EV_NONE                                         0
 #define EV_PREEMPT_PENDING              1
index 1de66a7..4d2df75 100644 (file)
@@ -32,10 +32,8 @@ int main(int argc, char **argv)
        /* these need to just exist somewhere.  don't free them. */
        struct event_queue *evq1 = get_ectlr_evq();
        struct event_queue *evq2 = get_ectlr_evq();
-       evq1->ev_flags |= EVENT_JUSTHANDLEIT | EVENT_INDIR | EVENT_SPAM_INDIR |
-                         EVENT_WAKEUP;
-       evq2->ev_flags |= EVENT_JUSTHANDLEIT | EVENT_INDIR | EVENT_SPAM_INDIR |
-                         EVENT_WAKEUP;
+       evq1->ev_flags |= EVENT_INDIR | EVENT_SPAM_INDIR | EVENT_WAKEUP;
+       evq2->ev_flags |= EVENT_INDIR | EVENT_SPAM_INDIR | EVENT_WAKEUP;
        /* hack in our own handler for debugging */
        evq1->ev_handler = trampoline_handler;
        evq2->ev_handler = trampoline_handler;
index e3c58e8..392f344 100644 (file)
@@ -316,19 +316,16 @@ int handle_events(uint32_t vcoreid)
  * application specific, then this will dispatch/handle based on its flags. */
 void handle_event_q(struct event_queue *ev_q)
 {
+       printd("[event] handling ev_q %08p on vcore %d\n", ev_q, vcore_id());
        /* If the program wants to handle the ev_q on its own: */
-       if (ev_q->ev_flags & EVENT_JUSTHANDLEIT) {
-               if (!ev_q->ev_handler) {
-                       printf("No ev_handler installed for ev_q %08p, aborting!\n", ev_q);
-                       return;
-               }
+       if (ev_q->ev_handler) {
                /* Remember this can't block or page fault */
                ev_q->ev_handler(ev_q);
                return;
        }
-       printd("[event] handling ev_q %08p on vcore %d\n", ev_q, vcore_id());
        /* Raw ev_qs that haven't been connected to an mbox, user bug: */
        assert(ev_q->ev_mbox);
+       /* The "default" ev_handler, common enough that I don't want a func ptr */
        handle_mbox(ev_q->ev_mbox);
 }