Don't miss events for early SCPs (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 25 Jan 2017 19:04:46 +0000 (14:04 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 9 Feb 2017 17:30:33 +0000 (12:30 -0500)
On occasion (esp in qemu), processes would hang.  They'd appear to be
waiting, but would have no syscalls pending.

It turns out that they were missing the "syscall complete" event.  You'd
need a blocking syscall that completed at a specific time:
- after we returned to userspace
- after they check for completion and register for an event
- before they yield
In that case, the process would expect notif_pending to prevent the yield.
notif_pending on vcore 0 was expected to get set by the event.

However, we only asked for a wakeup.  Under the current rules, we need to
actually specify an action related to a vcore to get that vcore to have
notif_pending set.  e.g. INDIR, SPAM, IPI - those all relate to specific
vcores.

I might change all this in the future - specifically so that EVENT_WAKEUP
is considered a 'SPAM' for notif_pending, but not for an actual message.
It's a bit complicated.

Rebuild glibc at your leisure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/syscall.c

index 9153142..6dc9a71 100644 (file)
 #include <parlib/arch/atomic.h>
 #include <ros/procdata.h>
 
-/* This is a simple ev_q that routes notifs to vcore0's public mbox.  This
- * should work for any bit messages, even if the process hasn't done any set up
- * yet, since the memory for the mbox is allocted by the kernel (procdata).
- * Don't send full messages to it, since the UCQ won't be initialized. */
+/* This is a simple ev_q that ultimately triggers notif_pending on vcore 0 (due
+ * to the IPI) and makes sure the process wakes up.
+ *
+ * This works for any bit messages, even if the process hasn't done any set up
+ * yet, since the memory for the mbox is allocted by the kernel (procdata). */
 struct event_mbox __simple_evbitmap = { .type = EV_MBOX_BITMAP, };
 struct event_queue __ros_scp_simple_evq =
                   { .ev_mbox = &__simple_evbitmap,
-                    .ev_flags = EVENT_WAKEUP,
+                    .ev_flags = EVENT_WAKEUP | EVENT_IPI,
                     .ev_alert_pending = FALSE,
                     .ev_vcore = 0,
                     .ev_handler = 0 };