[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: non-monotonic do_gettimeofday?



Hi, 
I tried the patch, but I still get decreasing timestamps sometimes. 

Is it possible to copy over time.c from 2.4.19 and use it in 2.4.14,
or are there any other dependencies? 

also, how do you test for non-monotonicity? Is it by by calling
gettimeofday in a loop from user space? I have never noticed
non-monotonic timestamps when I do that. Could you make your test
program(s) available? 

The only time it happens is under moderately high
network(and hence CPU) load, when I compare a user space send timestamp
for a UDP packet, and a kernel space receive timestamp (obtained via
do_gettimeofday) for that packet: the receive timestamp is sometimes
smaller than the send. 

ofcourse, if timer interrupts _can_ be missed, then there is not much
that can be done about it....

Thanks, 
akshay


On Wed, 4 Sep 2002, Johan Adolfsson wrote:

> On Tuesday 03 September 2002 21.59, Akshay Adhikari wrote:
> > hi,
> > in kernel 2.4.14, I have noticed that sometimes when the CPU load is
> > extremely high, the clock jumps backwards. Here is how it happens: I send
> > UDP packets and receive them back from an echoer, much like
> > ping. The packets have a user space send timestamp using gettimeofday,
> > and _kernel_ space receive timestamps retrieved using the SIOCGSTAMP
> > ioctl.
> >
> >
> > To get high precision receive timestamps, I have replaced the
> > get_fast_time call in netif_rx with the do_gettimeofday call.
> > Sometimes, under high load conditions, the kernel receive timestamps are
> > smaller than the user receive timestamps.
> >
> > Is this the same bug that used to be in 2.4.5? (there was a report of
> > this on the mailing list a while back).
> Probbaly not the same, but something nearby. Exactly what version of 
> linux/arch/cris/kernel/time.c are you using?
> (Check the $Id: tag)
> If you are using version 1.11 there has been changes after that that
> might fix this:
> E.g:
> @@ -124,11 +211,11 @@ void do_gettimeofday(struct timeval *tv)
>         cli();
>         *tv = xtime;
>         tv->tv_usec += do_gettimeoffset();
> -       if (tv->tv_usec >= 1000000) {
> +       restore_flags(flags);
> +       while (tv->tv_usec >= 1000000) {
>                 tv->tv_usec -= 1000000;
>                 tv->tv_sec++;
>         }
> -       restore_flags(flags);
>  }
> 
> Other changes in newer version is that we use the prescale timer to get
> an exact 100Hz clock (otherwise it's 64 ppm to fast, as indicated in the 
> datasheet), there might be some wrap problem not properly handled
> in the new code, although I haven't had any problems in my tests.
> 
> > a related question: do_gettimeofday disables interrupts, right?. does this
> > mean
> > that we could lose timer interrupts (or any other interrupts) simply by
> > calling gettimeofday in a tight loop (and this is a possible reason for
> > the non-monotonic timestamps?), or is the timer interrupt non-maskable?
> 
> It's not non-maskable, so it might be off, but I dought it's off for that 
> long - that would indicate some other problem somewhere.
> 
> > TIA,
> > akshay
> 
> /Johan
> 
>