Asserts/checks for early RKMSG context
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Nov 2012 23:53:04 +0000 (15:53 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Nov 2012 23:41:17 +0000 (15:41 -0800)
commit369210530361ea3124af42679ee1c05555f1b97e
treea180e94c8641c7e51b466bb023232914c68acf43
parent976477e164f610c7b50b0f88267f82cc23f3d9fb
Asserts/checks for early RKMSG context

The kernel tracks if it is in 'early routine kernel message context,'
which is an RKMSG before it blocks.  Once it blocks/kthreads, the core
leaves that context (in smp_idle), never to return for that kthread.
When the kthread starts up again, it'll be in default context.

Other than allowing us to assert messages that must be routine are in
fact routine, we can detect when a kmsg blocked, thus removing the
restriction on kmsg handler writers to put smp_idle at the bottom of
their functions.

There might be a better way to do this (permanent kthreads, track
whether it blocked in there?), but the basics are the same: when we come
back in to PRKM, we need to detect if we blocked or not, and if so, we
smp_idle.  And if not, we clear whatever flag we were using.  And that
same flag gets cleared in smp_idle as well.
kern/src/kthread.c
kern/src/smp.c
kern/src/testing.c
kern/src/trap.c