parlib: Allow cpu_relax_vc() calls from uthreads
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 14 Apr 2017 15:23:02 +0000 (11:23 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 3 May 2017 16:13:02 +0000 (12:13 -0400)
commit270eadeccb3f2e71ae7f7fbfc5e5edce419b60ae
tree1ce2cd95e77d3338325a0bec1e0423aa878decba
parentdab4fff40e3de91f8291cf1042183d316c61f89a
parlib: Allow cpu_relax_vc() calls from uthreads

This goes a little farther than commit 2ee62d285f56 ("parlib: Fix assertion
in cpu_relax_vc()").  Not only is it OK for uthreads to call
cpu_relax_vc(), but they should be able to call it regardless of whether
notifs are disabled or not.

Basically, any uthread can always call this.  If they aren't responsible
for handling preemption issues, they just do the normal cpu_relax(), which
is just a compiler barrier and "pause" on x86.

Here's how to think about this.  If we're spinning in userspace and waiting
on another core in userspace, we need to consider that the other core has
been preempted.  Our current preemption code is set up so that we'll
receive a notif (software IPI) if another core is preempted.  So if we have
notifs enabled, then we don't need to do anything fancy.  If notifs are
disabled, then we might not see the preemption message.  In that case, we
need to call ensure_vcore_runs() and all that (polling the vcoremap).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/syscall.c
user/parlib/vcore.c