local_irq_save (flags); ... /* critical region */ local_irq_restore (flags);
xtime.tv_nsec += 1000000000 / HZ; /* increment by one tick */
while (xtime.tv_nsec >= 1000000000) { /* roll over any ns > 10^9 */
xtime.tv_sec++;
xtime.tv_nsec -= 1000000000;
}
return_value->tv_sec = xtime.tv_sec;
/* timer interrupt here will lead to incorrect return value.
for example, successive reads may return such times as
10.999s, 10.001s, 11.001s, .... */
return_value->tv_usec = xtime.tv_nsec / 1000;