uCLinux: Timer Interrupt Handler

Having the understanding of HZ, jiffies, and system timer, it is appropriate to discuss the implementation of time management. Most of the jobs in time management are handled by a dedicated function called timer handler. In Microblaze, the kernel registers timer_interrupt as the interrupt handler:

irqreturn_t TIMER_TEXT timer_interrupt(int irq, void *dev_id)
{
timer_ack();
write_seqlock(&xtime_lock);
do_timer(1);
update_process_times(user_mode(get_irq_regs()));
profile_tick(CPU_PROFILING);
write_sequnlock(&xtime_lock);
return IRQ_HANDLED;
}

When kernel is executing timer handler, the timer is first acknowledged, followed by obtaining the xtime_lock lock, which protects access to jiffies and the wall time value, xtime. Most of the important work is performed in do_timer and update_process_times. The former is responsible in performing the increment of jiffies, updating the wall time in accordance with the elapsed ticks and also updating the system’s load average statistics.

update_process_times is executed when do_timer returned. It’s role is to update various statistics that a tick has elapsed. Besides process accounting, it decrements the currently running process’s time slice and determine whether there is need for reschedule. profile_tick is used to identify the hot spots of the kernel code and enabling the code profiler. Finally, xtime_lock is released and the handler returned with IRQ_HANDLED, which is defined as 1 to show that the handler is executed successfully.

You may also like...

Leave a Reply