Remove EVENT_SPAM_FLAGS (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 4 Aug 2015 17:43:38 +0000 (13:43 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
The spam flags were meant to capture the options relevant to actually
sending / spamming messages.  This was a little messed up.

First, there is no real reason to filter out all of the flags.  It's not
like EVENT_FOOBAR is going to be misinterpreted.  This had the effect of
dropping EVENT_NOMSG, so if you tried to SPAM_PUBLIC a NOMSG, you
actually would spam a UCQ of that bit value!  Luckily, no one did this.

But there is a case where we don't want to pass all of the flags:
INDIRs.  When we spam an INDIR, we do not want to pass NOMSG.  We're
sending a new message, telling userspace to look at another ev_q.  The
distinction is that SPAM_PUBLIC sends the original message, while
SPAM_INDIR sends an indir message.  I considered making a
"EVENT_MSG_FLAGS", but it's just NOMSG, and I'm hoping to get rid of
that.

Technically this changed a kernel header; feel free to ignore it.

kern/include/ros/event.h
kern/src/event.c

index fe16ad0..d34a44d 100644 (file)
@@ -30,9 +30,6 @@
 #define EVENT_JUSTHANDLEIT             0x400   /* 2LS should handle the ev_q */
 #define EVENT_THREAD                   0x800   /* spawn thread to handle ev_q */
 
-/* Certain event flags apply to spam messages */
-#define EVENT_SPAM_FLAGS               (EVENT_IPI | EVENT_VCORE_MUST_RUN)
-
 /* Event Message Types */
 #define EV_NONE                                         0
 #define EV_PREEMPT_PENDING              1
index 7ec56ca..5d7c345 100644 (file)
@@ -110,7 +110,7 @@ static void try_notify(struct proc *p, uint32_t vcoreid, int ev_flags)
 }
 
 /* Helper: sends the message and an optional IPI to the vcore.  Sends to the
- * public mbox.  This is meant for spammy messages. */
+ * public mbox. */
 static void spam_vcore(struct proc *p, uint32_t vcoreid,
                        struct event_msg *ev_msg, int ev_flags)
 {
@@ -339,8 +339,8 @@ static void send_indir(struct proc *p, struct event_queue *ev_q,
        }
        /* At this point, we actually want to send and spam an INDIR.
         * This will guarantee the message makes it to some vcore.  For flags, we
-        * only want to send flags relevant to spamming messages. */
-       spam_public_msg(p, &local_msg, vcoreid, ev_q->ev_flags & EVENT_SPAM_FLAGS);
+        * can't send NOMSG - that applied to the original ev_msg. */
+       spam_public_msg(p, &local_msg, vcoreid, ev_q->ev_flags & ~EVENT_NOMSG);
 }
 
 /* Send an event to ev_q, based on the parameters in ev_q's flag.  We don't
@@ -412,7 +412,7 @@ void send_event(struct proc *p, struct event_queue *ev_q, struct event_msg *msg,
         * we'll prefer to send it to whatever vcoreid we determined at this point
         * (via APPRO or whatever). */
        if (ev_q->ev_flags & EVENT_SPAM_PUBLIC) {
-               spam_public_msg(p, msg, vcoreid, ev_q->ev_flags & EVENT_SPAM_FLAGS);
+               spam_public_msg(p, msg, vcoreid, ev_q->ev_flags);
                goto out;
        }
        /* We aren't spamming and we know the default vcore, and now we need to