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.


0 Comments

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.