Quickly return/pop DONT_MIGRATE uthreads
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 6 Oct 2011 00:20:32 +0000 (17:20 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:08 +0000 (17:36 -0700)
commit5e4825eb4deb7103aa10359e7979ea41f58e540a
treee420d4884d5216ab93ebb7391532bd05faff5a1c
parent7a4e5721c0445bfe69b6db7336046e94632a3f79
Quickly return/pop DONT_MIGRATE uthreads

Two rules:

1) Don't check messages/handle events when you have a DONT_MIGRATE
uthread.  This will become important in the future.

2) All uses of DONT_MIGRATE must reenable notifs (and check messages) at
some point.  One such case is uthread_yield().  Another is
mcs_unlock_notifsafe().

This patch handles the case where a uthread turns on DONT_MIGRATE and
gets IPI'd before it can disable_notif.  We simply return to it, leaving
notif_pending turned on so that we make sure we will go back into vcore
context and check messages at the next safe opportunity.  That makes
this the one time we can leave vcore context with notif_pending: since
we know we'll get back to it right away.

Another way to look at it is that we lost the race, and got the IPI
before disabling.  This allows us to pretend like we won the race
(barring any bugs...).
Documentation/async_events.txt
user/parlib/event.c
user/parlib/include/i686/vcore.h
user/parlib/include/sparc/vcore.h
user/parlib/uthread.c
user/parlib/vcore.c