2000-11-10 07:22:43

by Jeff Garzik

[permalink] [raw]
Subject: jiffies wrap question...

The following is a piece of code from the latter half of
schedule_timeout, in kernel/sched.c. Is it possible that
schedule_timeout could return an incorrect value, if the jiffy value
wraps between the first and last lines shown below.

expire = timeout + jiffies;

init_timer(&timer);
timer.expires = expire;
timer.data = (unsigned long) current;
timer.function = process_timeout;

add_timer(&timer);
schedule();
del_timer_sync(&timer);

timeout = expire - jiffies;


--
Jeff Garzik |
Building 1024 | Would you like a Twinkie?
MandrakeSoft |


2000-11-10 07:35:54

by Philipp Rumpf

[permalink] [raw]
Subject: Re: jiffies wrap question...

On Fri, Nov 10, 2000 at 02:21:28AM -0500, Jeff Garzik wrote:
> The following is a piece of code from the latter half of
> schedule_timeout, in kernel/sched.c. Is it possible that
> schedule_timeout could return an incorrect value, if the jiffy value
> wraps between the first and last lines shown below.

let's say the first line happens n ticks before the wrap and the second,
m ticks afterwards.

> expire = timeout + jiffies;

expire = timeout + 2^32/2^64 - n = timeout - n

> timeout = expire - jiffies;

timeout = expire - m = timeout - n - m = timeout - (n+m)

(n+m) is the time that actually passed while we were asleep, and timeout
has the correct value (timeout - ticks that happened)>