kthreads.txt
Barret Rhoden

What Are They, And Why?
-------------------------------
Eventually a thread of execution in the kernel will want to block.  This means
that the thread is unable to make forward progress and something else ought
to run - the common case for this is when we wait on an IO operation.  This gets
trickier when a function does not know if a function it calls will block or not.
Sometimes they do, sometimes they don't.

The critical feature is not that we want to save the registers, but that we want
to preserve the stack and be able to use it independently of whatever else we do
on that core in the interim time.  If we knew we would be done with and return
from whatever_else() before we needed to continue the current thread of
execution, we could simply call the function.  Instead, we want to be able to
run the old context independently of what else is running (which may be a
process). 

We call this suspended context and the associated information a kthread, managed
by a struct kthread.  It's the bare minimum needed for the kernel to stop and
restart a thread of execution.  It holds the registers, stack pointer, PC,
struct proc* if applicable, stacktop, and little else.  There is no silly_state
/ floating point state, or anything else.  Its address space is determined from
which process context (possibly none) that was running.

We also get a few other benefits, such as the ability to pick and choose which
kthreads to run where and when.  Users of kthreads should not assume that the
core_id() stayed the same across blocking calls.  

We can also use this infrastructure in other cases where we might want to start
on a new stack.  One example is when we deal with low memory.  We may have to do
a lot of work, but only need to do a little to allow the original thread (that
might have failed on a page_alloc) to keep running, while we want the memory
freer to keep running too (or later) from where it left off.  In essence, we
want to fork, work, and yield or run on another core.  The kthread is just a
means of suspending a call stack and a context for a little while.

Side Note:
-----------
Right now, blocking a kthread is an explicit action.  Some function realizes it
can't make progress (like waiting on a block device), so it sleeps on something
(for now a semaphore), and gets woken up when it receives its signal.  This
differs from processes, which can be stopped and suspended at any moment
(pagefault is the classic example).  In the future, we could make kthreads be
preemptable (timer interrupt goes off, and we choose to suspend a kthread), but
even then kthreads still have the ability to turn off interrupts for tricky
situations (like suspending the kthread).  The analog in the process code is
disabling notifications, which dramatically complicates its functions (compare
the save and pop functions for _ros_tf and _kernel_tf).  Furthermore, when a
process disables notifications, it still doesn't mean it is running without
interruptions (it looks like that to the vcore).  When the kernel disables
interrupts, it really is running.

What About Events?
-------------------------------
Why not just be event driven for all IO?  Why do we need these kernel threads?
In short, IO isn't as simple as "I just want a block and when it's done, run a
function."  While that is what the block device driver will do, the subsystems
actually needing the IO are much simpler if they are threaded.  Consider the
potentially numerous blocking IO calls involved in opening a file.  Having a
continuation for each one of those points in the call graph seems like a real
pain to code.  Perhaps I'm not seeing it, but if you're looking for a simple,
light mechanism for keeping track of what work you need to do, just use a stack.
Programming is much simpler, and it costs a page plus a small data structure.

Note that this doesn't mean that all IO needs to use kthreads, just that some
will really benefit from it.  I plan to make the "last part" of some IO calls
more event driven.  Basically, it's all just a toolbox, and you should use what
you need.

Freeing Stacks and Structs
-------------------------------
When we restart a kthread, we have to be careful about freeing the old stack and
the struct kthread.  We need to delay the freeing of both of these until after
we longjmp to the new kthread.  We can't free the kthread before popping it,
and we are on the stack we need to free (until we pop to the new stack).

To deal with this, we have a "spare" kthread per core, which gets assigned as
the spare when we restart a previous kthread.  When making/suspending a kthread,
we'll use this spare.  When restarting one, we'll free the old spare if it
exists and put ours there.  One drawback is that we potentially waste a chunk of
memory (1 page + a bit per core, worst case), but it is a nice, simple solution.
Also, it will cut down on contention for free pages and the kthread_kcache,
though this won't help with serious contention issues (which we'll deal with
eventually).

What To Run Next?
-------------------------------
When a kthread suspends, what do we run next?  And how do we know what to run
next?  For now, we call smp_idle() - it is what you do when you have nothing
else to do, or don't know what to do.  We could consider having sleep_on() take
a function pointer, but when we start hopping stacks, passing that info gets
tricky.  And we need to make a decision about which function to call quickly (in
the code.  I don't trust the compiler much).  We can store the function pointer
at the bottom of the future stack and extract it from there.  Or we could put it
in per_cpu_info.  Or we can send ourselves a routine kernel message.

Regardless of where we put it, we ought to call smp_idle() (or something
similar) before calling it, since we need to make sure that whatever we call
right after jumping stacks never returns.  It's more flexible to allow a
function that returns for the func *, so we'll use smp_idle() as a level of
indirection.

Semaphore Stuff
-------------------------------
We use the semaphore (defined in kthread.h) for kthreads to sleep on and wait
for a signal.  It is possible that the signal wins the race and beats the call
to sleep_on().  The semaphore handles this by "returning false."  You'll notice
that we don't actually call __down_sem(), but instead "build it in" to
sleep_on().  I didn't want to deal with returning a bool (even if it was an
inline), because I want to minimize the amount of stuff we do with potential
stack variables (I don't trust the register variable).  As soon as we unlock,
the kthread could be restarted (in theory), and it could start to clobber the
stack in later function calls.

So it is possible that we lose the semaphore race and shouldn't sleep.  We
unwind the sleep prep work.  An alternative was to only do the prep work if we
won the race, but that would mean we have to do a lot of work in that delicate
period of "I'm on the queue but it is unlocked" - work that requires touching
the stack.  Or we could just hold the lock for a longer period of time, which
I don't care to do.  What we do now is try and down the semaphore early (the
early bailout), and if it fails then try to sleep (unlocked).  If it then
loses the race (unlikely), it can manually unwind.

Note that a lot of this is probably needless worry - we have interrupts disabled
for most of sleep_on(), though arguably we can be a little more careful with
pcpui->spare and move the disable_irq() down to right before setjmp().

What's the Deal with Stacks/Stacktops?
-------------------------------
When the kernel traps from userspace, it needs to know what to set the kernel
stack pointer to.  In x86, it looks in the TSS.  In riscv, we have a data
structure tracking that info (core_stacktops).  One thing I considered was
migrating the kernel from its boot stacks (x86, just core0, riscv, all the cores
have one).  Instead, we just make sure the tables/TSS are up to date right away
(before interrupts or traps can come in for x86, and right away for riscv).
These boot stacks aren't particularly special, just note they are in the program
data/bss sections and were never originally added to a free list.  But they can
be freed later on.  This might be an issue in some places, but those places
ought to be fixed.

There is also some implications about PGSIZE stacks (specifically in the
asserts, how we alloc only one page, etc).  The bootstacks are bigger than a
page (for now), but in general we don't want to have giant stacks (and shouldn't
need them - note linux runs with 4KB stacks).  In the future (long range, when
we're 64 bit), I'd like to put all kernel stacks high in the address space, with
guard pages after them.  This would require a certain "quiet migration" to the
new locations for the bootstacks (though not a new page - just a different
virtual address for the stacks (not their page-alloced KVA).  A bunch of minor
things would need to change for that, so don't hold your breath.

So what about stacktop?  It's just the top of the stack, but sometimes it is the
stack we were on (when suspending the kthread), other times kthread->stacktop
is just a scrap page's top.

What's important when suspending is that the current stack is not
used in future traps - that it doesn't get clobbered.  That's why we need to
find a new stack and set it as the current stacktop.  We also need to 'save'
the stack page of the old kthread - we don't want it to be freed, since we
need it later. When starting a kthread, I don't particularly care about which
stack is now the default stack.  The sleep_on() assumes it was the kthread's,
so unless we always have a default one that is only used very briefly and
never blocked on, (which requires a stack jump), we ought to just have a
kthread run with its stack as the default stacktop.

When restarting a kthread, we eventually will use its stack, instead of the
current one, but we can't free the current stack until after we actually
longjmp() to it.  This is the same problem as with the struct kthread dealloc.
So we can have the kthread (which we want to free later) hold on to the page we
wanted to dealloc.  Likewise, when we would need a fresh kthread, we also need a
page to use as the default stacktop.  So if we had a cached kthread, we then use
the page that kthread was pointing to.  NOTE: the spare kthread struct is not
holding the stack it was originally saved with.  Instead, it is saving the page
of the stack that was running when that kthread was reactivated.  It's spare
storage for both the struct and the page, but they aren't linked in any
meaningful way (like it is the stack of the page).  That linkage is only true
when a kthread is being used (like in a semaphore queue).

Current and Process Contexts
-------------------------------
When a kthread is suspended, should the core stay in process context (if it was
before)?  Short answer: yes.

For vcore local calls (process context, trapped on the calling core), we're
giving the core back, so we can avoid TLB shootdowns.  Though we do have to
incref (which writes a cache line in the proc struct), since we are storing a
reference to the proc (and will try to load its cr3 later).  While this sucks,
keep in mind this is for a blocking IO call (where we couldn't find the page in
any cache, etc).  It might be a scalability bottleneck, but it also might not
matter in any real case.

For async calls, it is less clear.  We might want to keep processing that
process's syscalls, so it'd be easier to keep its cr3 loaded.  Though it's not
as clear how we get from smp_idle() to a workable function and if it is useful
to be in process context until we start processing those functions again.  Keep
in mind that normally, smp_idle() shouldn't be in any process's context.  I'll
probably write something later that abandons any context before halting to make
sure processes die appropriately.  But there are still some unresolved issues
that depend on what exactly we want to do.

While it is tempting to say that we stay in process context if it was local, but
not if it is async, there is an added complication.  The function calling
sleep_on() doesn't care about whether it is on a process-allocated core or not.
This is solvable by using per_cpu_info(), and will probably work its way into a
future patch, regardless of whether or not we stay in process context for async
calls.
	
As a final case, what will we do for processes that were interrupted by
something that wants to block, but wasn't servicing a syscall?  We probably
shouldn't have these (I don't have a good example of when we'd want it, and a
bunch of reasons why we wouldn't), but if we do, then it might be okay anyway -
the kthread is just holding that proc alive for a bit.  Page faults are a bit
different - they are something the process wants at least.  I was thinking more
about unrelated async events.  Still, shouldn't be a big deal.

Kmsgs and Kthreads
-------------------------------
Is there a way to mix kernel messages and kthreads?  What's the difference, and
can one do the other?  A kthread is a suspended call-stack and context (thread),
stopped in the middle of its work.  Kernel messages are about starting fresh -
"hey core X, run this function."  A kmsg can very easily be a tool used to
restart a kthread (either locally or on another core).  We do this in the test
code, if you're curious how it could work.

Note we use the semaphore to deal with races.  In test_kthreads(), we're
actually using the kmsg to up the semaphore.  You just as easily could up the
semaphore in one core (possibly in response to a kmsg, though more likely due to
an interrupt), and then send the kthread to another core to restart via a kmsg.

There's no reason you can't separate the __up_sem() and the running of the
kthread - the semaphore just protects you from missing the signal.  Perhaps
you'll want to rerun the kthread on the physical core it was suspended on!
(cache locality, and it might be a legit option to allow processes to say it's
okay to take their vcore).  Note this may require more bookkeeping in the struct
kthread.

There is another complication: the way we've been talking about kmsgs (starting
fresh), we are talking about *routine* messages.  One requirement for routine
messages that do not return is that they handle process state.  The current
kmsgs, such as __death and __preempt are built so they can handle acting on
whichever process is currently running.  Likewise, __launch_kthread() needs to
handle the cases that arise when it runs on a core that was about to run a
process (as can often happen with proc_restartcore(), which calls
process_routine_kmsg()).  Basically, if it was a _S, it just yields the process,
similar to what happens in Linux (call schedule() on the way out, from what I
recall).  If it was a _M, things are a bit more complicated, since this should
only happen if the kthread is for that process (and probably a bunch of other
things - like they said it was okay to interrupt their vcore to finish the
syscall).  Note - this might not be accurate anymore (see discussions on
current_ctx).

To a certain extent, routine kmsgs don't seem like a nice fit, when we really
want to be calling schedule().  Though if you think of it as the enactment of a
previous scheduling decision (like other kmsgs (__death())), then it makes more
sense.  The scheduling decision (as of now) was made in the interrupt handler
when it decided to send the kernel msg.  In the future, we could split this into
having the handler make the kthread active, and have the scheduler called to
decide where and when to run the kthread.

Current_ctx, Returning Twice, and Blocking
--------------------------------
One of the reasons for decoupling kthreads from a vcore or the notion of a
kernel thread per user processs/task is so that when the kernel blocks (on a
syscall or wherever), it can return to the process.  This is the essence of the
asynchronous kernel/syscall interface (though it's not limited to syscalls
(pagefaults!!)).  Here is what we want it to be able to handle:
- When a process traps (syscall, trap, or actual interrupt), the process regains
  control when the kernel is done or when it blocks.
- Any kernel path can block at any time.
- Kernel control paths need to not "return twice", but we don't want to have to
  go through acrobatics in the code to prevent this.

There are a couple of approaches I considered, and it involves the nature of
"current_ctx", and a brutal bug.  Current_ctx (formerly current_ctx) is a
pointer to the trapframe of the process that was interrupted/trapped, and is
what user context ought to be running on this core if we return.  Current_ctx is
'made' when the kernel saves the context at the top of the interrupt stack (aka
'stacktop').  Then the kernel's call path proceeds down the same stack.  This
call path may get blocked in a kthread.  When we block, we want to restart the
current_ctx.  There is a coupling between the kthread's stack and the storage of
current_ctx (contents, not the pointer (which is in pcpui)).

This coupling presents a problem when we are in userspace and get interrupted,
and that interrupt wants to restart a kthread.  In this case, current_ctx points
to the interrupt stack, but then we want to switch to the kthread's stack.  This
is okay.  When that kthread wants to block again, it needs to switch back to
another stack.  Up until this commit, it was jumping to the top of the old stack
it was on, clobbering current_ctx (took about 8-10 hours to figure this out).
While we could just make sure to save space for current_ctx, it doesn't solve
the problem: namely that the current_ctx concept is not bound to a specific
kernel stack (kthread or otherwise).  We could have cases where more than one
kthread starts up on a core and we end up freeing the page that holds
current_ctx (since it is a stack we no longer need).  We don't want to bother
keeping stacks around just to hold the current_ctx.  Part of the nature of this
weird coupling is that a given kthread might or might not have the current_ctx
at the top of its stack.  What a pain in the ass...

The right answer is to decouple current_ctx from kthread stacks.  There are two
ways to do this.  In both ways, current_ctx retains its role of the context the
kernel restarts (or saves) when it goes back to a process, and is independent of
blocking kthreads.  SPOILER: solution 1 is not the one I picked

1) All traps/interrupts come in on one stack per core.  That stack never changes
(regardless of blocking), and current_ctx is stored at the top.  Kthreads sort
of 'dispatch' / turn into threads from this event-like handling code.  This
actually sounds really cool!

2) The contents of current_ctx get stored in per-cpu-info (pcpui), thereby
clearly decoupling it from any execution context.  Any thread of execution can
block without any special treatment (though interrupt handlers shouldn't do
this).  We handle the "returning twice" problem at the point of return.

One nice thing about 1) is that it might make stack management easier (we
wouldn't need to keep a spare page, since it's the default core stack).  2) is
also tricky since we need to change some entry point code to write the TF to
pcpui (or at least copy-out for now).

The main problem with 1) is that you need to know and have code to handle when
you "become" a kthread and are allowed to block.  It also prevents us making
changes such that all executing contexts are kthreads (which sort of is what is
going on, even if they don't have a struct yet).

While considering 1), here's something I wanted to say: "every thread of
execution, including a KMSG, needs to always return (and thus not block), or
never return (and be allowed to block)."  To "become" a kthread, we'd need to
have code that jumps stacks, and once it jumps it can never return.  It would
have to go back to some place such as smp_idle().

The jumping stacks isn't a problem, and whatever we jump to would just have to
have smp_idle() at the end.  The problem is that this is a pain in the ass to
work with in reality.  But wait!  Don't we do that with batched syscalls right
now?  Yes (though we should be using kmsgs instead of the hacked together
workqueue spread across smp_idle() and syscall.c), and it is a pain in the ass.
It is doable with syscalls because we have that clearly defined point
(submitting vs processing).  But what about other handlers, such as the page
fault handler?  It could block, and lots of other handlers could block too.  All
of those would need to have a jump point (in trap.c).  We aren't even handling
events anymore, we are immediately jumping to other stacks, using our "event
handler" to hold current_ctx and handle how we return to current_ctx.  Don't
forget about other code (like the boot code) that wants to block.  Simply put,
option 1 creates a layer that is a pain to work with, cuts down on the
flexibility of the kernel to block when it wants, and doesn't handle the issue
at its source.

The issue about having a defined point in the code that you can't return back
across (which is where 1 would jump stacks) is about "returning twice."  Imagine
a syscall that doesn't block.  It traps into the kernel, does its work, then
returns.  Now imagine a syscall that blocks.  Most of these calls are going to
block on occasion, but not always (imagine the read was filled from the page
cache).  These calls really need to handle both situations.  So in one instance,
the call blocks.  Since we're async, we return to userspace early (pop the
current_ctx).  Now, when that kthread unblocks, its code is going to want to
finish and unroll its stack, then pop back to userspace.  This is the 'returning
twice' problem.  Note that a *kthread* never returns twice.  This is what makes
the idea of magic jumping points we can't return back across (and tying that to
how we block in the kernel) painful.

The way I initially dealt with this was by always calling smp_idle(), and having
smp_idle decide what to do.  I also used it as a place to dispatch batched
syscalls, which is what made smp_idle() more attractive.  However, after a bit,
I realized the real nature of returning twice: current_ctx.  If we forget about
the batching for a second, all we really need to do is not return twice.  The
best place to do that is at the place where we consider returning to userspace:
proc_restartcore().  Instead of calling smp_idle() all the time (which was in
essence a "you can now block" point), and checking for current_ctx to return,
just check in restartcore to see if there is a tf to restart.  If there isn't,
then we smp_idle().  And don't forget to handle the cases where we want to start
and scp_ctx (which we ought to point current_ctx to in proc_run()).

As a side note, we ought to use kmsgs for batched syscalls - it will help with
preemption latencies.  At least for all but the first syscall (which can be
called directly).  Instead of sending a retval via current_ctx about how many
started, just put that info in the syscall struct's flags (which might help the
remote syscall case - no need for a response message, though there are still a
few differences (no failure model other than death)).

Note that page faults will still be tricky, but at least now we don't have to
worry about points of no return.  We just check if there is a current_ctx to
restart.  The tricky part is communicating that the PF was sorted when there
wasn't an explicit syscall made.


Aborting Syscalls (2013-11-22)
-------------------------------
On occasion, userspace would like to abort a syscall, specifically ones that
are listening on sockets/conversations where no one will ever answer.

We have limited support for aborting syscalls.  Kthreads that are in
rendez_sleep() (common for anything in the 9ns chunk of the kernel, which
includes any conversation listens) can be aborted.  They'll return with an
error string to userspace.

The easier part is the rules for kernel code to be abortable:
- Restore your invariants with waserror() before calling rendez_sleep().
- That's really it.
So if you're holding a qlock, put your qunlock() code and any other unwinding
(such as a kfree()) in a waserror() catch.  As it happens, it looks like plan9
already did that (at least for the rendez in listen).  And, as always, you
can't hold a spinlock when blocking, regardless of aborting calls or anything.

I don't want arbitrary sleeps to be abortable.  For instance, if a kthread is
waiting on an arbitrary semaphore/qlock, we won't allow an abort.  The
reasoning is that the kthread will eventually acquire the qlock - we're not
waiting on external sources to wake up.  That's not 100% true - a kthread
could be blocked on a qlock, and the qlock holder could be abortable.  In the
future, we could build some sort of "abort inheritance", usable by root or
something (danger of aborting another process's kthread).  Alternatively, we
could make qlocks abortable too, though that would require all qlocking code
to be unwindable.

The harder part to syscall aborting is safely waking a kthread.  There are
several layers to go through from uthread or syscall down to the condition
variable a kthread is sleeping on.  Given a uthread, find its syscall.  Given
a syscall, find its kthread.  Given the kthread, find the CV.  And during all
of these, syscalls complete concurrently, kthreads get repurposed for other
syscalls, CVs could be freed (though that doesn't happen).  Syscalls are often
on stacks, so when they complete, the memory is both gibberish and potentially
in use.

Ultimately, I decided on a system of "safe abort attempts", where it is
harmless to be wrong with an attempt.  Instead of dealing with the races
associated with memory freeing and syscalls completing, the aborts will only
work if it is safe to work (using a lookup via pointer, and only dereferencing
if the lookup succeeds).

As it stands now, all abortable kthreads/sleepers/syscalls are on a per-proc
list, and we can lookup by struct syscall*.  They are only on the list when
they are abortable (the CV can be poked), and the invariant is that when they
are on the list, they are in a state that can be safely aborted: the kthread
is working on the syscall, it hasn't unwound, it is still in rendez_sleep(),
the CV is safe, etc.  The details of this protection are sorted out with
__reg_abortable_cv() and dereg_abortable_cv() (since it's really the condition
variable that we're trying to find).  So from the kernel side, nothing bad can
happen if you ask to abort an arbitrary struct syscall*.

The actual abort takes the "write/signal, then wake" method.  The aborter
tracks down the kthread via the lookup, the success of which guarantees the
sleeper is in rendez_sleep() (or similar sleep paths), marks "SC_ABORT",
(barriers), and attempts to wake the kthread (cv_broadcast, since we need to
be sure we woke the right kthread).

On the user side, we set an alarm to run an event handler that will cancel our
syscall.  The alarm stuff is fairly standard (runs in vcore context).
Userspace no longer has the concern of syscalls completing while they abort,
since the kernel will only abort syscalls that are abortable.  However, it may
have issues (in theory) with aborting future syscalls.  If the alarm goes off
when the uthread is in another later syscall (which may happen to use the same
struct syscall*), then we could accidentally abort the wrong call.  There's an
aspect of time associated with the first abort alarm handler.  This is
relatively easy to handle: just turn off the alarm before reusing that syscall
struct for a syscall.  This relies on a property of the alarms: that when
deregistering completes, the alarm handler will not be running concurrently.
Incidentally, there is *another* minor trick here: the uthread when adjusting
the alarm will issue a syscall, possibly reusing its old sysc*, but that will
be *after* deregistering its original alarm: the point at which we could have
potentially accidentally cancelled an arbitrary syscall.  Also note that the
call to change the kernel alarm wouldn't actually block and become abortable,
but regardless, we're safe.

There are a couple downsides to the "safe abort attempts" approach.  We can
only abort syscalls when they are at a certain point - if they aren't
currently sleeping, the call will fail.  Technically, the abort could take
effect later on in the life of a syscall (the aborter flags the kthread to
abort concurrent with the kthread waking up naturally, and then the call
aborts on the next rendez_sleep that needs to block).  Related to this
limitation, userspace must keep attempting to cancel a syscall until it
succeeds.  It may also be told an abort succeeded, even if the call actually
completes (the aborter flags the kthread, the rendez wakes naturally, and the
kthread never blocks again).  Ultimately, we can't "fire and forget" our abort
attempt.  It's not a huge problem though, and is less of a problem than my
older approaches that didn't have this problem.

For instance, the original idea I had was for userspace to flag the syscall
(flags |= SC_ABORT).  It could do this at any time.  Whenever the kthread was
going to block in an abortable location (e.g. rendez_sleep()), it would see
the flag and abort.  It might already be asleep, so we would also provide a
syscall that would 'kick' the kthread responsible for some sysc*, to wake it
up to see the flag and abort.  The first problem was writing to the sysc
flags.  Unless we know the memory is actually the syscall we want, this could
result in randomly writing to memory (such as a uthread's stack).  I ran into
similar issues in the kernel: you can't touch a kthread struct unless you know
it is the kthread you want.

Once I started dealing with the syscall -> kthread mapping, it became clear
I'd need a per-proc lookup service in the kernel, which acts as a way to lock
a reference to the kthread.  I could solve the 'kthread memory safety' problem
by looking up by reference, similar to how pid2proc works.  Analogously, by
changing the interface for sys_abort_syscall() to be a "lookup" approach, I
solve the struct syscall * memory problem.

As a smaller note, I considered registering every kthread with the process
right away (specifically, when we link the syscall to the kthread->sysc) for
the sysc->kthread lookup service.  But this would get expensive, since every
syscall pays the lookup tax (and we'd need to worry about scaling).  We want
syscalls to be fast, but the infrequent aborts can be expensive.  The obvious
change was to only save the abortable kthreads.  The tradeoff is that we can't
flag syscalls for aborting unless they are in an abortable state.  This
requires multiple pokes by userspace.  In theory, they would have to deal with
that scenario anyways (in case they attempt to abort before we even register
in the first place).

As another side note, if userspace ever has a struct syscall allocator, for
use in async (non-uthread stack-based) syscalls, we'll need to not reuse a
syscall struct until after the cancel alarm has been disarmed.  Right now we
do this by not having the uthread issue another syscall til after the disarm,
since uthread stack-based syscalls are inherently bound to the uthread.  A
simple solution would be to have a per-uthread syscall struct, which that
uthread uses preferentially, and the sysc is only freed when the uthread is
freed.  Not only would this scale better than accessing the sysc allocator for
every syscall, but also there is no worry of reuse til the uthread disarms and
exits.

It is a userspace bug for a uthread to set the alarm and not unset it before
either making a syscall or exiting.  The root issue of that potential bug is
that someone (alarm handler) holds a pointer to a uthread, with the intent of
cancelling its syscall, and we need to somehow take back that pointer (cancel
the alarm) before reusing the syscall or freeing the uthread.  I considered
not making the alarm guarantee that when the cancel returns, the handler isn't
running concurrently.  We could handle the races in the alarm handler and in
the cancel code, but it's an added hassle that isn't clearly needed.  This
does mean we have to run the alarm handlers serially, while holding the alarm
lock.  I'm fine with this, for now.  Perhaps if users want more concurrency,
their handlers can spawn or wake up a uthread.

It is also worth noting that many rendez_sleep() calls actually return right
away.  This is common if some data is already in the queue (or whatever the
condition is that we want to conditionally sleep on).  Since registration is a
little bit heavier than just locking the CV, I use the classic "check, signal,
check again" style, where we check cond, then register, and then check cond
for real.  The initial check is the optimization, while the "signal, then
check" is the true synchronization.  I use this style all over the place
(check out the event delivery with concurrent vcore yields code).

Because of this optimization, we have a slightly odd interface: __reg is
called with the CV lock held, and dereg_ is not.  There are some lock ordering
issues.  Without the optimization, we could simply make the order {list lock,
CV lock}, so that the aborter can use the list lock to keep a kthread/cv alive
(one of the struct cv_lookup_elm in the code, to be precise) while it
cv_broadcasts.  However, the "check first" optimization would need to lock and
unlock the CV a couple times, which seems excessive.  So we switch the lock
order to {CV, list lock}, and the aborter doesn't hold the list lock while
signalling the CV.  Instead, it keeps the cle alive with a flag that dereg_
spins on.  This spinwait is why dereg can't hold the CV lock: it would create
a circular dependency.
