Use an IRQ alarm in rendez_sleep_timeout()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 14 Jul 2016 14:04:18 +0000 (10:04 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Jul 2016 15:43:10 +0000 (11:43 -0400)
commita7c26a48fa73fb03d5e30e5f1c1f973a9b30df75
tree5f784f311af5b6484196c0fe9ae7b1444aa99299
parentc709a2e5e2fce235ac9ea6b6b3fb1cda94dd4704
Use an IRQ alarm in rendez_sleep_timeout()

Using an RKM alarm in this way is buggy.  Consider the case where the alarm
immediately fires, and we don't sleep.  "Fires", currently means the alarm
IRQ happened, not that the function ran!  Yikes.  So the RKM gets sent to
our core to run in the future.  Then we don't block (the rendez condition
happened or saw we weren't on the tchain), and we return.  Since we return,
we unwind the stack and basically free the alarm structure.  Later, the RKM
accesses this freed memory.  Based on some code comments, I was aware of
this possibility, but missed it when making rendez_sleep_timeout().

The real problem is unset_alarm() doesn't actually guarantee that the
memory is unused.  It should, which is the subject of a future patch.
However, it will basically require unset_alarm for RKM alarms to
potentially block, which we'd like to avoid in rendez code.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/rendez.c