Index: include/nucleus/timer.h =================================================================== --- include/nucleus/timer.h (revision 3081) +++ include/nucleus/timer.h (working copy) @@ -710,6 +710,8 @@ void xntimer_tick_periodic(xntimer_t *timer); +void xntimer_tick_periodic_inner(xntslave_t *slave); + void xntimer_adjust_all_aperiodic(xnsticks_t delta); #ifdef CONFIG_SMP Index: ksrc/nucleus/timer.c =================================================================== --- ksrc/nucleus/timer.c (revision 3081) +++ ksrc/nucleus/timer.c (working copy) @@ -465,9 +465,8 @@ * @note Only active timers are inserted into the timer wheel. */ -void xntimer_tick_periodic(xntimer_t *mtimer) +void xntimer_tick_periodic_inner(xntslave_t *slave) { - xntslave_t *slave = timer2slave(mtimer); xnsched_t *sched = xnpod_current_sched(); xntbase_t *base = &slave->base; xntlholder_t *holder; @@ -502,9 +501,17 @@ } xnpod_do_rr(); /* Do round-robin management. */ +} - if (base->hook) +void xntimer_tick_periodic(xntimer_t *mtimer) +{ + xntslave_t *slave = timer2slave(mtimer); + xntbase_t *base = &slave->base; + + if (unlikely(base->hook)) base->hook(); + else + xntimer_tick_periodic_inner(slave); } static void Index: ksrc/nucleus/timebase.c =================================================================== --- ksrc/nucleus/timebase.c (revision 3081) +++ ksrc/nucleus/timebase.c (working copy) @@ -475,9 +475,8 @@ if (base == &nktbase) xntimer_tick_aperiodic(); else { - unsigned cpu = xnarch_current_cpu(); - struct percpu_cascade *pc = &base2slave(base)->cascade[cpu]; - xntimer_tick_periodic(&pc->timer); + xntslave_t *slave = base2slave(base); + xntimer_tick_periodic_inner(slave); } xnlock_put_irqrestore(&nklock, s);