Fixes preemption handling bug
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 5 Sep 2012 23:48:58 +0000 (16:48 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 5 Sep 2012 23:48:58 +0000 (16:48 -0700)
If a vcore comes up while another vcore is stealing its uthread, it
needs to check for preemptions.  There are a bunch of ways to do this.
The old way was wrong, since it assumed the preempt_ev_q had an actual
mbox, which it wasn't.  Given our current preempt_ev_q style, we want to
check our public mbox for any preempt-msg-spam, which we'd get if we
were the last core around.

Note this might not be ideal - we still have a lot of messages being
sent, and we might be able to cut that down by using a different style.
For now, it fixes the bug.

user/parlib/uthread.c

index 2ac9e00..a0e5ba8 100644 (file)
@@ -131,15 +131,18 @@ void __attribute__((noreturn)) uthread_vcore_entry(void)
        assert(in_vcore_context());
        /* If someone is stealing our uthread (from when we were preempted before),
         * we can't touch our uthread.  But we might be the last vcore around, so
-        * we'll handle preemption events. */
+        * we'll handle preemption events (spammed to our public mbox). */
        while (atomic_read(&vcpd->flags) & VC_UTHREAD_STEALING) {
-               handle_event_q(preempt_ev_q);
+               /* Note we're handling INDIRs and other public messages while someone
+                * is stealing our uthread.  Remember that those event handlers cannot
+                * touch cur_uth, as it is "vcore business". */
+               handle_mbox(&vcpd->ev_mbox_public);
                cpu_relax();
        }
        /* If we have a current uthread that is DONT_MIGRATE, pop it real quick and
         * let it disable notifs (like it wants to).  Other than dealing with
-        * preemption events, we shouldn't do anything in vc_ctx when we have a
-        * DONT_MIGRATE uthread. */
+        * preemption events (or other INDIRs), we shouldn't do anything in vc_ctx
+        * when we have a DONT_MIGRATE uthread. */
        if (current_uthread && (current_uthread->flags & UTHREAD_DONT_MIGRATE))
                __run_current_uthread_raw();
        /* Check and see if we wanted ourselves to handle a remote VCPD mbox.  Want