Re-enginer the wheel: a rejuvenation of BSD callout(9) and timer facilities - report weeks 1-4

Davide Italiano davide.italiano at gmail.com
Tue Jun 19 15:53:32 UTC 2012


Hi,
I apologize for the delay in submitting but here's what I've done recently.
A complete commit history may be found here:
http://freshbsd.org/search?q=committer%3Adavide&branch=PROJECT_CALLOUTNG

Week 1:
- Switch the callout(9) backend from ticks to struct bintime in order
achieve better precision
- Rework the callout data-structure in order to survive to these
changes paying attention to avoid breakages (if possible)
- Introducing a separate per-cpu queue in order to process callout
once they're examined in callout_tick
- Convert some tcp_timer related code that rely on tick-based nature
of backend, without this change, world won't build

Week 2:
- Fix some bug that causes random memory corruption on the list and so
unexpected behaviour of the system
- Optimize the callout_tick() code to scan the entire wheel only when
it's needed
- Integrate the switched backend with the eventtimers(4)
infrastructure to exploit better precision
- refactor the cpu_new_callout() function in
sys/kern/kern_clocksource.c to adapt to the aforementioned changes

Week 3:
- Start to experiment an extension of the current KPI adding the
callout_reset_bt_on() in which we specify timeouts in terms of struct
bintime rather than ticks.
- Add (experimentally) a function to the sleepqueue(9) KPI
sleepq_set_timeout_bt() in which the timeout may be specified in terms
of bintime rather than ticks, and which takes advantage of the new
precision capabilities of the callout subsystem.
- Convert usleep() service to the new KPI callout_reset_bt_on()
- Run some benchmarks to see how much we gained: resutls may be found
here http://blogs.freebsdish.org/davide/2012/06/07/the-tale-of-usleep-a-k-a-sometimes-precision-matters/

Week 4:

-Fix (or at least, workaround) an include conflict in libprocstat
which causes buildworld to fail, after my recent changes to
sys/sys/_callout.h header.
- Extend the condvar(9) KPI introducing a new cv_timedwait_bt_sig()
function so that we can specify timeout precision in terms of struct
bintime.
-  Refactor the kern_select() and the sys_poll() code so that these
two services may rely on cv_timedwait_bt_sig() rather than on the
previous less precise cv_timedwait_sig().
- Optimize callout_tick() code avoiding some computation of the
callwheel bucket when it's not needed
- Run benchmark on usleep() again, as well as on select(). Results are
so much better than before: :
http://blogs.freebsdish.org/davide/2012/06/17/random-updates/


Davide


More information about the soc-status mailing list