MCS locks properly disable thread migration
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 12 Sep 2011 21:52:17 +0000 (14:52 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:06 +0000 (17:36 -0700)
commit5141d2d4be2046cfd7751678fd58a727be5f14a8
tree5862669c0535e8391c3064f99ba78cb9865966e0
parentab38fcf57d6801eb36c6c08a15d24be4056d0e1e
MCS locks properly disable thread migration

Any time you disable notifs, you need to disable uthread migration too.
The reason for this is that we can't atomically disable interrupts on a
vcore, so we need to make sure we're not moved around in the instant
after we read vcoreid and before we actually disable notifs.  x86's
'cli' doesn't have this issue.  =)

I put an assert in disable_notifs() to catch any future callers that
don't do this.

Also note that disabling/enabling notifs isn't the only reason to
disable migration; we want to disable migration for code that requires
staying on a vcore.  We don't necessarily want to turn it off an on at
exactly the same call sites as enable/disable notifs.  Check
uthread_yield() for an example (note it doesn't even enable_notifs()
directly).
user/parlib/include/vcore.h
user/parlib/mcs.c
user/parlib/vcore.c