Updating the Time and Date
User programs get the current time and date from the
xtime
variable. The kernel must
periodically update this variable, so that its value is always
reasonably accurate.
The update_times( )
function,
which is invoked by the global timer interrupt handler, updates the
value of the xtime
variable as
follows:
void update_times(void) { unsigned long ticks; ticks = jiffies - wall_jiffies; if (ticks) { wall_jiffies += ticks; update_wall_time(ticks); } calc_load(ticks); }
We recall from the previous description of the timer interrupt
handler that when the code of this function is executed, the xtime_lock
seqlock has already been acquired
for writing.
The wall_jiffies
variable
stores the time of the last update of the xtime
variable. Observe that the value of
wall_jiffies
can be smaller than
jiffies-1
, since a few timer
interrupts can be lost, for instance when interrupts remain disabled for
a long period of time; in other words, the kernel does not necessarily
update the xtime
variable at every
tick. However, no tick is definitively lost, and in the long run,
xtime
stores the correct system time.
The check for lost timer interrupts is done in the mark_offset
method of cur_timer
; see the earlier section "Timekeeping Architecture in
Uniprocessor Systems.”
The update_wall_time( )
function invokes the update_wall_time_one_tick(
)
function ticks
consecutive times; normally, each invocation adds 1,000,000 to the
xtime.tv_nsec
field. If the value of
xtime.tv_nsec
becomes ...
Get Understanding the Linux Kernel, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.