clockintr: add a kernel-facing API
We need an API for creating, scheduling, and rescheduling clock
interrupts.
- Add struct clockintr, a schedulable clock interrupt callback.
- Add clockintr_establish(). Allocates a new struct clockintr and
binds it to the given clockintr_queue.
- Add clockintr_expiration(). Returns the clockintr's absolute
expiration uptime.
- Add clockintr_nsecuptime(). Returns the clockintr's parent queue's
cached uptime. Using a cached timestamp is cheaper than calling
nsecuptime(9) repeatedly when we don't absolutely need to.
- Add clockintr_schedule(). Schedules the clock interrupt to run at
or after the given absolute uptime.
- Add clockintr_advance(). Reschedules the clock interrupt in the
future on the given period relative to the parent queue's cached
uptime.
With the above pieces in place we can push most of the scheduling
code for hardclock()/statclock()/schedclock() from clockintr_dispatch()
into the wrapper functions clockintr_hardclock(), clockintr_statclock(),
and clockintr_schedclock(). These wrappers are temporary. I don't
want to muck up the wrapped functions while things are still moving
around.
For the moment these interfaces are internal to kern_clockintr.c. In
a later patch we will move the prototypes into <sys/clockintr.h> so
anyone can use them. We first need to add a data structure for
sorting the clockintr structs. We also need to add a mutex to
clockintr_queue to allow arbitrary threads to safely manipulate clock
interrupts established on other CPUs.
Shown on hackers@. Tweaked by mlarkin@.
ok mlarkin@, "no objections" kettenis@