Uthread blockon handles notif_disabled uthreads
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 13 Oct 2011 01:06:56 +0000 (18:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:40 +0000 (14:48 -0800)
The in_vcore_context() check tests TLS, not whether or not notifs are
disabled.  It is the latter we care about more.  We need to check
DONT_MIGRATE before checking if notifs are disabled (vcoreid), and any
code that does have DONT_MIGRATE set *when making a syscall* needs to
have notifs disabled.  I don't explicitly check for this, since you have
to set DONT_MIGRATE to be sure about your vcoreid.

user/parlib/uthread.c

index eaf9d4c..fca8abd 100644 (file)
@@ -258,11 +258,18 @@ void ros_syscall_blockon(struct syscall *sysc)
                __ros_syscall_blockon(sysc);
                return;
        }
+       /* At this point, we know we're a uthread.  If we're a DONT_MIGRATE uthread,
+        * then it's disabled notifs and is basically in vcore context, enough so
+        * that it can't call into the 2LS. */
+       assert(current_uthread);
+       if (current_uthread->flags & UTHREAD_DONT_MIGRATE) {
+               assert(!notif_is_enabled(vcore_id()));  /* catch bugs */
+               __ros_syscall_blockon(sysc);
+       }
        /* double check before doing all this crap */
        if (atomic_read(&sysc->flags) & (SC_DONE | SC_PROGRESS))
                return;
        /* So yield knows we are blocking on something */
-       assert(current_uthread);
        current_uthread->sysc = sysc;
        uthread_yield(TRUE);
 }