Kernel alarm handling moved to RKM context
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 18 Nov 2013 23:07:32 +0000 (15:07 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Nov 2013 01:16:27 +0000 (17:16 -0800)
commitfbee73f5eee7b0daed8a8e1d7c7a7f757634aa32
tree55bd57003e752568f75eb07e480eddb8ed6d8ec7
parent1e9964faa1be7b0ea53cfd9ec4d8332a64e00543
Kernel alarm handling moved to RKM context

Instead of running handlers from IRQ context, we shift them to RKM
context.  Alternatively, we could only do this for the awaiter handlers
(and not the semaphores), but it's probably not a big deal.

The reason for this so that we can easily send_event from an alarm
handler.  Right now, you can't send_event from IRQ context since it
might trigger a proc wakeup (grab the proclock, scheduler callbacks,
etc), all of which are not irqsave.

While I could change all of those, I'd rather cut down on the amount of
things in IRQ context (both for interrupt latency as well as for code
safety - RKMs can block, etc, though a block will delay all alarms under
the current code).  Keep in mind that send_event() can also trigger an
mmap call.  If we ever want blockable alarms, we can easily put that in
(IRQ handler wakes sems, executes handlers marked "IRQOK", and launched
an RKM otherwise).
kern/include/alarm.h
kern/src/alarm.c
kern/src/schedule.c
kern/src/time.c