Hook CEQs into the event infrastructure (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 19 Aug 2015 13:53:46 +0000 (09:53 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
CEQs are now an event mbox type.  You can get a basic one (128 elements)
when you get_eventq(), but if you want a different size (you probably
do), then you want a raw eventq and initialize it yourself.

Reinstall your kernel headers.  Probably don't need a compiler rebuild.

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

index f6e3b68..fb9223c 100644 (file)
@@ -60,9 +60,11 @@ struct event_msg {
 /* Include here since the mboxes need to know event.h basics (e.g. event_msg) */
 #include <ros/ucq.h>
 #include <ros/evbitmap.h>
+#include <ros/ceq.h>
 
 #define EV_MBOX_UCQ                            1
 #define EV_MBOX_BITMAP                 2
+#define EV_MBOX_CEQ                            3
 
 /* Structure for storing / receiving event messages.  An overflow causes the
  * bit of the event to get set in the bitmap.  You can also have just the bit
@@ -72,6 +74,7 @@ struct event_mbox {
        union {
                struct ucq                              ucq;
                struct evbitmap                 evbm;
+               struct ceq                              ceq;
        };
 };
 
index f304ac5..d36a9be 100644 (file)
@@ -6,6 +6,7 @@
  * processes. */
 
 #include <ucq.h>
+#include <ceq.h>
 #include <bitmask.h>
 #include <event.h>
 #include <atomic.h>
@@ -70,9 +71,9 @@ static void send_evbitmap_msg(struct evbitmap *evbm, struct event_msg *msg)
        evbm->check_bits = TRUE;
 }
 
-/* Posts a message to the mbox.  Make sure that if mbox is a user
- * pointer, that you've checked it *and* have that processes address space
- * loaded.  This can get called with a KVA for mbox. */
+/* Posts a message to the mbox.  mbox is a pointer to user-accessible memory.
+ * If mbox is a user-provided pointer, make sure that you've checked it.
+ * Regardless make sure you have that process's address space loaded. */
 static void post_ev_msg(struct proc *p, struct event_mbox *mbox,
                         struct event_msg *msg, int ev_flags)
 {
@@ -86,6 +87,9 @@ static void post_ev_msg(struct proc *p, struct event_mbox *mbox,
                case (EV_MBOX_BITMAP):
                        send_evbitmap_msg(&mbox->evbm, msg);
                        break;
+               case (EV_MBOX_CEQ):
+                       send_ceq_msg(&mbox->ceq, p, msg);
+                       break;
                default:
                        printk("[kernel] Unknown mbox type %d!\n", mbox->type);
        }
index 074bdd9..a043465 100644 (file)
@@ -10,6 +10,7 @@
 #include <ros/procdata.h>
 #include <parlib/ucq.h>
 #include <parlib/evbitmap.h>
+#include <parlib/ceq.h>
 #include <parlib/vcore.h>
 #include <stdlib.h>
 #include <string.h>
@@ -71,6 +72,9 @@ void event_mbox_init(struct event_mbox *ev_mbox, int mbox_type)
                case (EV_MBOX_BITMAP):
                        evbitmap_init(&ev_mbox->evbm);
                        break;
+               case (EV_MBOX_CEQ):
+                       ceq_init(&ev_mbox->ceq, CEQ_OR, CEQ_DEFAULT_SZ, CEQ_DEFAULT_SZ);
+                       break;
                default:
                        printf("Unknown mbox type %d!\n", ev_mbox->type);
                        break;
@@ -102,6 +106,9 @@ void event_mbox_cleanup(struct event_mbox *ev_mbox)
                case (EV_MBOX_BITMAP):
                        evbitmap_cleanup(&ev_mbox->evbm);
                        break;
+               case (EV_MBOX_CEQ):
+                       ceq_cleanup(&ev_mbox->ceq);
+                       break;
                default:
                        printf("Unknown mbox type %d!\n", ev_mbox->type);
                        break;
@@ -248,6 +255,8 @@ bool extract_one_mbox_msg(struct event_mbox *ev_mbox, struct event_msg *ev_msg)
                        return get_ucq_msg(&ev_mbox->ucq, ev_msg);
                case (EV_MBOX_BITMAP):
                        return get_evbitmap_msg(&ev_mbox->evbm, ev_msg);
+               case (EV_MBOX_CEQ):
+                       return get_ceq_msg(&ev_mbox->ceq, ev_msg);
                default:
                        printf("Unknown mbox type %d!\n", ev_mbox->type);
                        return FALSE;
@@ -292,6 +301,8 @@ bool mbox_is_empty(struct event_mbox *ev_mbox)
                        return ucq_is_empty(&ev_mbox->ucq);
                case (EV_MBOX_BITMAP):
                        return evbitmap_is_empty(&ev_mbox->evbm);
+               case (EV_MBOX_CEQ):
+                       return ceq_is_empty(&ev_mbox->ceq);
                default:
                        printf("Unknown mbox type %d!\n", ev_mbox->type);
                        return FALSE;