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>
Thu, 16 Jan 2014 19:45:59 +0000 (11:45 -0800)
commit517843a378b487dade4b9a7a251730efcd0633c0
treea7cf0c7a3c7add5a61fdf13df5a1b471c00f5e00
parentc709d5db04233f7f79bbe747b315b813908494e8
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