Just one comment on one of your FIXMEs:
- rcu_assign_pointer(t->sleepable_cb_fn, NULL);
- /* FIXME: probably do something about the SLEEPABLE flag */
I guess we should store the flag in the timer struct somewhere, and then restrict the set_callback() functions so that the regular variant only works without the flag set, and the _sleepable version only works if the flag is set? Otherwise we may end up calling a non-sleepable function in sleepable context or vise versa...
-Toke